原则 2 不调用具有抽象基类的生命周期回拨

2022-08-30 22:46:16

我有这样的情况:

抽象类:

abstract class AbstractBase
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     * @var integer
     */
    protected $id;

    /**
     * @ORM\Column(type="datetime", name="updated_at")
     * @var \DateTime $updatedAt
     */
    protected $updatedAt;

    /**
     * @ORM\PreUpdate
     */
    public function setUpdatedAt()
    {
        die('THIS POINT IS NEVER REACHED');
        $this->updatedAt = new \DateTime();
    }
}

混凝土类:

/**
 * @ORM\Entity(repositoryClass="Entity\Repository\UserRepository")
 * @ORM\Table(name="users")
 * @ORM\HasLifecycleCallbacks
 */
class User extends AbstractBase
{
    // some fields, relations and setters/getters defined here, these all work as expected.
}

然后我在我的控制器中调用它,如下所示:

$user = $this->em->find('Entity\User', 1);
// i call some setters here like $user->setName('asd');
$this->em->flush();
die('end');

一切都按预期工作,因此抽象类中的id字段是为User实体创建的,我可以访问它等。问题是,“die('这一点永远不会到达')”这句话从未达到过。(请注意@ORM\预更新日期)这意味着不会对继承的对象调用生命周期回调。这是一个错误,还是有原因的?


答案 1

您的抽象基类必须注释为映射超类,并包含 HasLifecycleCallbacks-Annotation

更多信息:教义文档中的继承映射

/**
 * @ORM\MappedSuperclass
 * @ORM\HasLifecycleCallbacks
 */
abstract class AbstractBase
{
    [...]

    /**
     * @ORM\PreUpdate
     */
    public function setUpdatedAt()
    {
        $this->updatedAt = new \DateTime();
    }
}

/**
 * @ORM\Entity(repositoryClass="Entity\Repository\UserRepository")
 * @ORM\Table(name="users")
 */
class User extends AbstractBase
{
    // some fields, relations and setters/getters defined here, these all work as expected.
}

答案 2

您必须使用 对基类进行批注,并使用 对函数进行批注@ORM\HasLifecycleCallbacks@ORM\preUpdate

您有拼写错误(PreUpdate 应该是 preUpdate),在创建时也不会调用 preUpdate(仅在更新时调用)。因此,如果您希望在创建时也触发它,则应添加.@ORM\prePersist


推荐