Php Symfony:在实体中添加自定义函数是一种不好的做法吗?

Php Symfony:在实体中添加自定义函数是一种不好的做法吗?,php,symfony,doctrine-orm,doctrine,Php,Symfony,Doctrine Orm,Doctrine,我知道实体是保存数据的基本类 但是,如果实体具有处理数据的自定义函数,这是一种不好的做法吗 我个人认为这种功能应该进入不同的服务。但是在这种情况下,getnextpyroll非常有用: <?php class Payroll { /** * @var int * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUT

我知道实体是保存数据的基本类

但是,如果实体具有处理数据的自定义函数,这是一种不好的做法吗

我个人认为这种功能应该进入不同的
服务
。但是在这种情况下,
getnextpyroll
非常有用:

<?php
class Payroll
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="last_payroll", type="datetime", nullable = true)
     */
    private $lastPayroll;

    /**
     * Set lastPayroll
     *
     * @param \DateTime $lastPayroll
     * @return CompanyBase
     */
    public function setLastPayroll($lastPayroll)
    {
        $this->lastPayroll = $lastPayroll;

        return $this;
    }

    /**
     * Get lastPayroll
     *
     * @return \DateTime 
     */
    public function getLastPayroll()
    {
        return $this->lastPayroll;
    }

    public function getNextPayroll()
    {
        $payrollNext = clone $this->getLastPayroll();
        $payrollNext->add(new \DateInterval("P1M"));

        return $payrollNext;
    }


}

据我所知,只要您的实体没有进入数据库层(存储库应该负责),这应该不是一个坏做法

因此,在实体中,或多或少只返回EntityData(比如返回属于该实体的修改数据的方法)应该可以。通过这种方式,您还可以轻松地使用Twig中的方法,它会自动搜索方法名称(例如,
{{User.name}
将搜索
用户->获取名称()
,如果找不到,它将搜索
用户->名称()

如果重用此部件并希望是动态的,那么创建自定义细枝扩展也是一个好主意


我认为,只有当您要做非常复杂的事情时,您才需要一个服务,您实际上还需要注入EntityManager,并从其他实体检索数据,这些实体可能不属于通常关系的一部分。

如果您的代码仍然满足可靠的原则,那么这不是一个坏做法(在这种情况下,主要是单一责任原则)

所以,如果该方法与实体逻辑无关(例如,从您的实体发送电子邮件或将某些内容持久化到数据库中),那么它是错误的。否则,它是绝对正确的

与实体相关的逻辑的主要属性——它应该与实体中的其他内容位于同一层


事实上,条令实体不仅仅是数据传输对象(没有行为)。条令的开发人员坚持使用实体作为丰富的模型(查看条令的开发人员之一Marco Pivetta,并查看他的)

下面的答案大体上是正确的。对于您的特定情况,下一份工资单应在
工资单存储库中确定。这样做的另一个原因是下一份工资单尚未发生。使用存储库预测下一份工资单日期并仅存储实际工资单日期。一致性也很重要。I如果95%的实际业务逻辑驻留在服务中,那么您也可以将剩余的5%放在服务中。