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

Rom*_*hko 5 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*ich 5

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

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

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

您甚至可以最终添加大量的getter函数,这些函数仅用于从外部计算结果.

您可以在FOSUserBundle的Model\User类中看到一个示例.(代码)