【问题标题】:How to remove\update doctrine 2 entities after another entity has been removed\updated如何在删除\更新另一个实体后删除\更新教义 2 实体
【发布时间】:2015-06-21 10:54:50
【问题描述】:

在我的特殊情况下,我有以下几点:

我有一个实体,在某些时候可能会被自动删除为孤儿。现在,我需要对它的移除做出反应。而且,我也不知道这个反应会不会涉及到一些教条操作。特别是,我需要在一些解耦的组件上触发一些方法,我不知道这个组件的实现细节。例如,我对该组件的默认实现使用了 Doctrine,并且需要在前面提到的实体被删除时删除一些实体。

现在问题本身:

我知道不能在生命周期事件中触发EntityManager刷新操作(文档中有提到,是因为生命周期事件发生在flush方法中)。特别是它不能在 postRemove 事件中触发。所以,问题是,在删除一些实体之后,我需要触发一些可能(或可能不会)触发原则实体管理器刷新方法的操作,但我无法在 postRemove 事件中执行此操作。而且我不知道还有什么地方可以安全地做到这一点。

【问题讨论】:

    标签: php orm doctrine-orm doctrine


    【解决方案1】:

    好的,最后我做出了以下决定:

    在 postRemove 操作中,我只是将一些操作(作为简单的可调用对象)添加到队列中。稍后,在 postFlush 事件中,我处理排队的操作(没关系,因为 postFlush 事件在刷新过程完成后发生)。

    为了以某种通用方式实现这一点,我创建了一个非常简单的队列管理器库 (https://github.com/numesmat/QueueManager) 和一个相应的 symfony 包来连接它 (https://github.com/numesmat/QueueManagerBundle)。

    现在,要添加一些 postRemove 逻辑,我只需要在我的事件订阅者中执行类似的操作:

    public function postRemove(LifecycleEventArgs $args) {
        $queueManager = $this->container->get('arko.queue_manager');
        $queueManager->add(function() {
            // Some logic that can potentially use doctrine flush here
        }, 'my_queue_name');
    }
    
    public function postFlush(PostFlushEventArgs $args) {
        $queueManager = $this->container->get('arko.queue_manager');
        $queueManager>process('my_queue_name');
    }
    

    在接下来的几天里,我会将自述文件写入我的小型队列管理器库和捆绑包。现在,可以使用 composer 安装这个库或包(arko/queue-managerarko/queue-manager-bundle 作曲家包)并像描述的那样简单地使用以上。

    【讨论】:

      猜你喜欢
      • 2011-09-30
      • 2018-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 2020-01-10
      • 1970-01-01
      相关资源
      最近更新 更多