如何在删除另一个实体后删除\ update doctrine 2实体\ updated

时间:2015-06-21 10:54:51

标签: php orm doctrine-orm doctrine

在我的特定情况下,我有以下内容:

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

现在问题本身:

我知道在生命周期事件中无法触发EntityManager刷新操作(在文档中提到,这是因为生命周期事件发生在flush方法中)。特别是它不能在postRemove事件中触发。所以,问题在于,在删除一些实体之后,我需要触发一些可能(或可能不会)触发doctrine entitymanager flush方法的操作,但是我不能在postRemove事件中执行它。而且我不知道我能安全地做任何其他地方。

1 个答案:

答案 0 :(得分:0)

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

在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-manager arko / queue-manager-bundle 编写器包)安装此库或捆绑包,并使用简单描述上方。