我们在official documentation中看到,Doctrine实现了实体侦听器,仅在特定实体上发生某些情况时才执行。
但是,生命周期事件侦听器/订阅者与实体侦听器之间会有不同的注入。实际上,对于听众/订阅者,Doctrine仅将LifecycleEventArgs
对象注入已定义的回调中
// Event listener/subscriber
public function postUpdate(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
}
无论如何都可以让您访问实体,但是随后在实体侦听器中,实体也被显式注入为第一个参数
// Entity listener
public function postUpdate(object $entity, LifecycleEventArgs $args)
{
$entity2 = $args->getEntity();
}
,它在$args
中仍然可用。文档中也对此进行了报告:
实体侦听器方法接收两个参数,即实体实例 和生命周期事件。
但是实体侦听器中的$entity
和$args->getEntity()
之间到底有什么区别?
答案 0 :(得分:0)
是同一实体。
由于LifecycleEventArgs
甚至被注入“通用”学说监听器中,因此您需要检索实体对象。另一方面,LifecycleEventArgs
在这两种情况下都可以检索很多内容。
为此,他们在两个操作中都使用了相同的对象:这在我的POV中很常见并且可以接受。
您可以通过类似的操作自己进行验证
// Entity listener
public function postUpdate(object $entity, LifecycleEventArgs $args)
{
$entity2 = $args->getEntity();
dump(spl_obj_hash($entity) == spl_obj_hash($entity)); // you can echo this, or log, or VarDump, or whatever
}