我有这样的情况:
抽象类:
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('THIS POINT is NEVER‘)“这一行从来没有达到过。(注意@ORM)这意味着不会在继承的对象上调用lifecycleCallbacks。这是一个bug,还是有原因的?
发布于 2012-10-07 20:52:30
必须用@ORM\HasLifecycleCallbacks
注释基类,用@ORM\preUpdate
注释函数
你有一个拼写错误(PreUpdate应该是preUpdate),而且preUpdate不会在创建时调用(只在更新时调用)。因此,如果您希望它在创建时也被触发,您应该添加@ORM\prePersist
。
发布于 2012-10-29 18:44:31
虽然接受的回复对于一般情况是正确的,但在这种特殊情况下(时间戳),您实际上希望使用理论扩展Timestampable,例如这里解释的Lifecycle Callback Issue When Extending FOSUserBundle User Entity
发布于 2013-08-04 02:55:23
具有HasLifecycleCallbacks的MappedSuperclass必须与其子实体位于相同的名称空间或目录中,这一点很重要。
当MappedSuperclass位于一个目录(Model)而实体位于另一个目录(Entity)时,我遇到了生命周期回调的问题。将MappedSuperclass放在与实体(Entity)相同的目录中解决了问题。
https://stackoverflow.com/questions/7320425
复制相似问题