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

时间:2015-02-20 14:38:26

标签: php symfony doctrine-orm

我正在创建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也有位置?

谢谢!

2 个答案:

答案 0 :(得分:3)

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

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

如果您需要更复杂的内容或需要重复使用它,例如日期过滤器,那么创建Twig扩展程序会更好。

答案 1 :(得分:1)

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

如果你真的想要分开的文件,为了你的审美,然后使用特征,但请记住,它不适合和传统使用它们。