在Symfony中放置自定义实体方法的最佳实践


Best practise for placing custom Entity methods in Symfony

我正在创建Symfony项目。现在我正在尝试找到添加自定义方法的最佳实践。你的是什么?


视觉解释:

users

id | name | surname
---+------+--------
1  | John | Smith
2  | Matt | Malone

Entity'User.php

namespace TestBundle'Entity'User;
use Doctrine'ORM'Mapping as ORM;
/**
 * User
 * @ORM'Table(name="users")
 * @ORM'Entity
 */
class User
{
    /**
     * @ORM'Column(name="id", type="string", length=36)
     * @ORM'Id
     * @ORM'GeneratedValue(strategy="UUID")
     */
    private $id;
    /**
     * @ORM'Column(name="name", type="string", length=255, nullable=true)
     */
    private $name;
    /**
     * @ORM'Column(name="surname", type="string", length=255, nullable=true)
     */
    private $surname;
    /**
     * OneToMany
     */
    private $userCompanies;
    {{ Setters and Getters }}
}

我应该在哪里存储自定义方法,例如:

function getFullName()
{
     return sprintf("%s %s", $this->getName(), $this->getSurname());
}

或更复杂的:

function getCurrentUserCompany()
{
    foreach ($this->getUserCompanies() as $company) {
        if ($company->isActive()) {
            return $company;
        }
    }
    return null;
}

请注意,所有数据均通过JSON

到目前为止,我尝试扩展class,但annotations无法按预期工作。将自定义methods放在同一个文件中看起来很垃圾,因为其中会有多个。

但是

..但是如果有repositoryClass - maby也有定制methods的地方吗?

谢谢!

如果是关于主要用于显示目的的方法,那么它们与getter非常相似,在我看来,它们最适合实体本身,所以在你的User.php类中。

存储库用于定义从存储级别(DB,缓存...(获取实体的方法,但视图级别(您的树枝(应从实体本身获取数据。

如果您需要更复杂的东西或需要重用它,例如日期过滤器,那么最好创建一个 Twig 扩展。

像这样的方法属于实体类,没有理由拆分代码。如果许多实体类共享某些方法,则始终可以为它们创建共享的基抽象类或特征。

如果您真的为了美观而想要单独的文件,请使用特征,但请记住,这不是正确和常规的使用。