2015-06-21 84 views
0

在我的具體情況我有以下幾點:如何刪除更新學說的另一個實體後2個實體已被刪除更新

我有在某些時候可以作爲一個孤兒被自動刪除的實體。現在,我需要對其刪除做出反應。而且,我不確切知道這個反應是否會涉及一些學說操作。特別是,我需要在某些解耦組件上觸發某種方法,但我不知道這個組件的實現細節。例如,該組件的默認實現使用了Doctrine,並且在前面提到的實體已被刪除時需要刪除某個實體。

現在的問題本身:

我知道了EntityManager刷新操作不能在生命週期事件(它在文檔中提到,這是因爲生命週期事件發生在沖洗方法所觸發)。特別是它不能在postRemove事件中觸發。所以,問題是,在刪除一些實體之後,我需要觸發一些可能(或不可能)觸發原子實體管理器刷新方法的操作,但我無法在postRemove事件中執行此操作。我不知道任何其他地方我可以安全地做到這一點。

回答

0

好吧,finaly我來到了以下決定:

在刪除後的動作我只是添加一些動作(如一個簡單的調用)到隊列中。之後,在postFlush事件中,我處理排隊的動作(其正常,因爲postFlush事件發生在刷新過程完成後)。

爲了以某種一般的方式實現這個,我創建了一個非常簡單的隊列管理器庫(https://github.com/numesmat/QueueManager)和一個相應的symfony包來連接它(https://github.com/numesmat/QueueManagerBundle)。

現在,增加一些邏輯刪除後我只是需要做這樣的事情在我的事件訂閱:

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'); 
} 

在接下來的幾天裏,我該怎麼寫自述我小的隊列管理器庫和捆綁。現在,可以使用作曲者(分別爲arko /隊列管理器arko/queue-manager-bundle composer包)來安裝該庫或捆綁包並且如上所述使用簡單。