【问题标题】:Symfony 2 - Handling multiple entity listeners on one EntitySymfony 2 - 在一个实体上处理多个实体侦听器
【发布时间】:2018-10-10 16:57:30
【问题描述】:

假设我有一个实体 Product,我的应用程序中有一个实体 ListenerA(preUpdateprePersist)。

class ListenerA {
public function prePersist(LifecycleEventArgs $args)
{
    ...
}
public function prePersist(LifecycleEventArgs $args)
{
    ...
}

假设Product 实体有一个属性visible (bool),对于该实体的每次更新,visible 可能会根据某些逻辑更改为 1 或 0。

在那个 Symfony 应用程序中,还有一个来自私有存储库的 PHP 包。这个包负责跟踪所有实体上的实体更改。它有一个ListenerB 跟踪所有实体。它还使用应用程序中使用的相同 Doctrine。在onFlush,此侦听器会将更改推送到 AWS 流服务中。

我的问题是例如有一条记录将被更新。 当然会触发two listenersListenerAListenerB)。

产品 编号:1 标题:'一些标题' 属性1:1 属性2:1 属性3:1 可见:1

例如,业务规则是实体发生更改或更新时,如果 property1、property2 和 property3 为 true,则 Product 的可见性必须设置为 true,否则为 false。。该规则是在实体侦听器上设置的。

因此,例如,如果我更改 property3 = 0,那么 visible 现在必须是 false

但正如我所提到的,PHP 包上还有另一个侦听器 ListenerB,它也跟踪该实体的更改。

问题在于,当该 PHP 包上的 ListenerB 被触发时,它不会获得由 ListenerA 触发的 Productvisible 属性上的 更新 更改(实现业务逻辑)。

例如,Productvisibility1,它被 ListenerB 推送到流式传输,但随后 ListenerA 将其更改为 0一些逻辑。

推送到流的数据不是更新的值。

在推送ListenerB 上的更改之前,我需要跟踪在ListenerA 上所做的最后更改。

很可能我对ListenerB 的访问权限有限。我拥有在ListenerA 上编辑代码的完全权限。

您对此有什么建议或解决方法吗?

我将不胜感激。

【问题讨论】:

    标签: symfony


    【解决方案1】:

    通常在定义侦听器时,您可以指定priority

    最高优先级的监听器被首先执行

    services:
        app.listener.a:
            class: Acme\Listener\AListener
            tags:
                - { name: doctrine.event_listener, event: postPersist, priority: 100 }
    
    services:
        app.listener.b:
            class: Acme\Listener\BListener
            tags:
                - { name: doctrine.event_listener, event: postPersist, priority: 50 }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 2013-09-23
      • 2017-01-12
      • 2018-08-23
      相关资源
      最近更新 更多