【问题标题】:Doctrine - Difference between injected entities in entity listener教义 - 实体侦听器中注入实体之间的区别
【发布时间】:2018-09-19 07:53:29
【问题描述】:

正如我们在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() 之间究竟有什么区别?

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案1】:

    这是同一个实体。

    由于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
    }
    

    【讨论】:

    • 是的,但重点不是为什么要注入LifecycleEventArgs,而是为什么要在$args 中已经存在实体时显式注入它...
    • @DrKey 考虑测试:注入它而不是必须存根来自args 的调用可能是一个原因。这对我来说只是一个“捷径”,不会增加任何复杂性或其他任何东西。我敢打赌只是出于这些原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 2010-10-07
    • 2017-01-16
    • 1970-01-01
    相关资源
    最近更新 更多