在我的特定情况下,我有以下内容:
我有一个实体,在某些时候可能会被自动删除为孤儿。现在,我需要对它的删除作出反应。而且,我不确切地知道这种反应是否会涉及某些学说操作。特别是,我需要在一些解耦组件上触发一些方法,我不知道这个组件的实现细节。例如,我对该组件的默认实现使用了Doctrine,并且在删除前面提到的实体时需要删除一些实体。
现在问题本身:
我知道在生命周期事件中无法触发EntityManager刷新操作(在文档中提到,这是因为生命周期事件发生在flush方法中)。特别是它不能在postRemove事件中触发。所以,问题在于,在删除一些实体之后,我需要触发一些可能(或可能不会)触发doctrine entitymanager flush方法的操作,但是我不能在postRemove事件中执行它。而且我不知道我能安全地做任何其他地方。
答案 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 编写器包)安装此库或捆绑包,并使用简单描述上方。