2016-02-28 29 views
0

有沒有辦法用控制器的KNPLabs DoctrineBehaviors覆蓋softdeletable行爲?Symfony2,KnpLabs DoctrineBehaviors:如何真正刪除一個軟可刪除的實體?

在我的行動,我希望能夠暫時「禁用」的softdeletable行爲,所以我可以真正從數據庫,而不是隻設置deletedAt字段中刪除我的實體。

+0

是的,請參閱https://stackoverflow.com/questions/22812675/disable-soft-deleteable-filter-for-hard-delete-record-doesnt-work – spackmat

+1

@spackmat您的鏈接是指不同的包(Gedmo/SoftDeleteable),而我的答案指的是KnpLabs DoctrineBehaviors SoftDeletable。 – Roubi

+0

是的,但這也適用於KnpLabs DoctrineBehaviors SoftDeletable(我在項目中以這種方式實現它)。但是你自己的回答更好,非常神經質。 ;) – spackmat

回答

2

nifr好心給了我在Github上一個答案: https://github.com/KnpLabs/DoctrineBehaviors/issues/294#issuecomment-190310921

Quick 'n dirty:

$entityManager = $this->getDoctrine()->getManager('default'); 
$eventManager = $entityManager->getEventManager(); 

// remove the softdeletable subscriber 
$subscriber = $this->get('knp.doctrine_behaviors.softdeletable_subscriber'); 
$eventManager->removeEventListener($subscriber->getSubscribedEvents(), $subscriber); 

// remove entity while the subscriber is removed 
$entityManager->remove($entity); 
$entityManager->flush(); 

// add back the subscriber 
$eventManager->addEventSubscriber($subscriber); 

問題 這會觸發錯誤 「you have requested a non-existent service」,因爲服務是不公開的。

要解決此問題,根據nifr,2個可能的解決方案:

1)定義控制器本身作爲一個服務並注入用戶服務的明確
2)創建一個工廠的服務,將返回訂戶服務和呼叫您的控制器之一

+0

此解決方案不再適用於您的鏈接源代碼。 'knp.doctrine_behaviors.softdeletable_subscriber'服務沒有公開,沒有額外的工作就無法訪問。所以現在它會導致這個錯誤:'你已經請求了一個不存在的服務「knp.doctrine_behaviors.softdeletable_subscriber」。「 – spackmat

+0

@spackmat你是對的。這就是我對nifr說的話。在我的原始答案中,我只將鏈接放到github線程中,所以可以讀取所有內容,但它已被編輯。我會改變它。 – Roubi