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

Php 原则2不调用具有抽象基类的生命周期回调,php,doctrine,doctrine-orm,Php,Doctrine,Doctrine Orm,我有这样的情况: 抽象类: abstract class AbstractBase { /** * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") * @var integer */ protected $id; /** * @ORM\Column(type="datetime", name="updated_at") * @va

我有这样的情况:

抽象类:
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字段将为用户实体创建,我可以访问它等等。 问题是,永远不会到达“die(‘永远不会到达此点’)”这一行。(注意@ORM\PreUpdate)这意味着不调用lifecycleCallbacks
继承的对象。这是一个bug,还是有其原因?

我认为必须用@ORM\haslifecycellbacks注释基类


也许我错了,但我不认为在持久化实体时不会触发预更新。你应该有一个@prePersist

但我仍然不确定这是否有效,但你可以试试。否则,一种解决方法是覆盖setUpdatedAt函数,只调用其父函数,但这有点难看


希望@prePersist能为您提供帮助。

也许您可以将此作为如何设置注释的参考?testcase似乎是有效的,并且与您的用例相匹配。

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

进一步资料:


必须用
@ORM\HasLifecycleCallbacks
注释基类,用
@ORM\preUpdate
注释函数


您有一个输入错误(PreUpdate应该是PreUpdate),并且在创建时不调用PreUpdate(仅在更新时)。因此,如果您希望它在创建时也被触发,您应该添加
@ORM\prePersist

,而接受的回复在一般情况下是正确的,在这种特殊情况下(时间戳)实际上,您希望使用原则扩展timestable,例如这里解释的

重要的是,带有HasLifecycleCallbacks的MappedSuperclass与其子实体位于同一命名空间或目录中


当MappedSuperclass位于一个目录(模型)中而实体位于另一个目录(实体)中时,我遇到了生命周期回调问题。将MappedSuperclass与实体(Entity)放在同一目录中解决了这个问题。

哦,对不起,这是我的示例代码中的一个错误,我现在修复了它(删除了$em->persist($user);行)。不是这样的:/还有,问题是扩展类根本不调用回调,我都试过了。你是否像这样包含了:
@ORM\haslifecycellbacks()
我刚刚试过,@PostLoad似乎有效,但数据库的(PreUpdate,PrePersist…)都没有.我还没能让上述操作正常工作-即使使用MappedSuperclass注释,回调也不会触发-使用symfony standard edition 2.1.6-有人能确认或拒绝吗?检查您的子(用户)类中是否有空的预更新处理程序,如果子类中有,父类处理程序将不会被调用。如果由于项目的结构,我无法将父类移动到同一个目录中,该怎么办?嗯,那我就不知道了。也许这是SensioLabs团队应该关注的事情。。。
/**
 * @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.
}