可以在实体中放置像hasSomething()或isSomething这样的方法吗?

时间:2015-04-28 08:53:13

标签: php symfony doctrine-orm

我们总是将Symfony2中的实体用作仅包含setter和getter的普通PHP对象。但是如果我们在实体中有集合,那么放置方法可能是有用的,比如hasSomeProperty($ name)或isSomething($ someType)。例如:

class User
{
    /** @var ArrayCollection */
    private $friends;

    public function hasFriend($name)
    {
         foreach ($this->friends as $friend) {
             if ($friend->getName() === $name) {
                 return true;
             }
         }

         return false;
    }
}

从一个角度来看,这种方法包含的逻辑不应该放在实体中。但这种逻辑只涉及这个实体,因此根据得墨忒耳的法律,实体是写它的正确位置。你有什么想法?

1 个答案:

答案 0 :(得分:5)

将这些hasX()isX()方法添加到您的实体中绝对没问题,这是一个很好的做法,我个人认为这是放置它们的正确位置。

将这些方法保留在您的实体中的主要参数就是这样 您可以访问privateprotected属性来计算hasX()isX()的结果。

否则 - 将反射放在一边 - 您需要通过为不能用于任何其他目的的属性创建getter函数来向公共API公开(可能是明智的)信息。

你甚至可以最终添加大量的getter函数......只能用于从外部计算结果。

您可以在FOSUserBundle的Model\User课程中看到一个示例。的Code