Php 在实体中放置hasSomething()或isSomething之类的方法可以吗?

Php 在实体中放置hasSomething()或isSomething之类的方法可以吗?,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我们总是使用Symfony2中的实体作为普通PHP对象,仅使用setter和getter。但是,如果我们在一个实体中有一个集合,那么在其中放置一些方法可能会很有用,比如hasSomeProperty($name)或isSomething($someType)。例如: class User { /** @var ArrayCollection */ private $friends; public function hasFriend($name) {

我们总是使用Symfony2中的实体作为普通PHP对象,仅使用setter和getter。但是,如果我们在一个实体中有一个集合,那么在其中放置一些方法可能会很有用,比如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;
    }
}

从一个角度来看,这个方法包含逻辑,不应该放在实体中。但这样的逻辑只与这个实体有关,所以根据德米特定律,实体是书写它的正确地方。您对此有何想法?

将这些
hasX()
isX()
方法添加到您的实体中肯定是不错的做法,我个人认为这是放置它们的正确位置

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

否则,将反射放在一边,您需要通过为不具有任何其他用途的属性创建getter函数,向公共API公开(可能是合理的)信息

你甚至可以添加大量的getter函数来。。。仅用于外部计算结果


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

您可以将自定义函数放在实体类的末尾。这个问题虽然很好,但过于基于观点,也不是一个正确的堆栈溢出问题。除此之外:我认为在你的办公室里有麻烦是完全可以的entity@WouterJ,完全同意你,可能没有一个正确的答案。但我很想听到人们在项目中使用的惯例,因为我们的团队中对此有争论。@WouterJ虽然这个问题可能有点基于观点,但它对新的符号学家有很强的教育价值。仅为
hasX()
isX()
的外部计算而暴露敏感信息的危险。。。此外,还可能创建大量的
getY()
getZ()
。。。方法不可否认。我甚至认为将这些方法保存在实体中是一种最佳实践。