2014-11-13 77 views
0

可以處理postFlush事件或類似的事情嗎?我需要訪問新寄存器的一些數據來生成另一些東西,但必須在沖洗之後,因爲我使用Gedmo Slug和我需要的一個數據是slu。。SonataAdmin onComplete

回答

0

是的,在你的services.yml/xml文件中創建一個監聽器,然後監聽器自己改變你需要的代碼。

#src/Acme/Bundle/YourBundle/Resources/config/services.yml 
services: 
    contact_onflush.listener: 
     class: Acme\Bundle\YourBundle\Listener\YourListener 
     arguments: [@request_stack] 
     tags: 
      - { name: doctrine.event_listener, event: onFlush } 
    contact_postflush.eventlistener: 
     class: Acme\Bundle\YourBundle\Listener\YourListener 
     tags: 
      - { name: doctrine.event_listener, event: postFlush} 

在監聽器類:

<?php 

namespace Acme\YourBundle\YourListener; 

use Doctrine\Common\EventArgs; 
use Doctrine\Common\EventSubscriber; 
use Doctrine\ORM\Event\OnFlushEventArgs; 
use Doctrine\ORM\Event\PostFlushEventArgs; 
use Symfony\Component\HttpFoundation\RequestStack; 

class YourListener implements EventSubscriber 
{ 
    private $requestStack; 
    private $needsFlush; 

    public function __construct(Request $requestStack) 
    { 
     $this->requestStack= $requestStack; 
     $this->needsFlush= false; 
    } 

    public function onFlush(OnFlushEventArgs $args) 
    { 
     $em = $args->getEntityManager(); 
     $uow = $em->getUnitOfWork(); 

     // we would like to listen on insertions and updates events 
     $entities = array_merge(
      $uow->getScheduledEntityInsertions(), 
      $uow->getScheduledEntityUpdates() 
    ); 

    foreach ($entities as $entity) { 
     // every time we update or insert a new [Slug entity] we do the work 
     if ($entity instanceof Slug) { 
      //modify your code here 
      $x = new SomeEntity(); 
      $em->persist($x); 
      //other modifications 
      $this-needsFlush = true; 
      $uow->computeChangeSets(); 
     } 
    } 
} 

public function postFlush(PostFlushEventArgs $eventArgs) { 
    if ($this->needsFlush) { 
     $this->needsFlush = false; 
     $eventArgs->getEntityManager()->flush(); 
    } 
} 

您可以使用computeChangeSet(單數),但我使用它有問題。您可以使用preUpdate來查找已更改的字段,而不是使用onFlush,但在嘗試保留時此事件有限制,您需要將它與needFlush之類的內容配對以觸發postFlush。

如果您仍然有錯誤,您可以發佈更多的代碼來顯示您正在修改的內容嗎?

+0

它很棒,但我需要更多的東西。我可以如何讓這個服務的主機名? –

+0

您可以從請求或請求堆中獲取主機。我更新了代碼,並且需要在需要主機名的地方添加requestStack-> getHost()。 – George

+0

甜!有用! Ty George! :)你真棒 –