2016-07-11 12 views
0

私は、ユーザが注文を作成できるシステムを持っています。オーダーが作成されるとすぐに、別のエンティティー・テーブルを、オーダーを作成した現行ユーザー、作成したユーザー、およびその他の情報で更新する必要があります。symfony PHPイベントリスナーが動作しない

基本的にログ。

ここは私のListenerクラスです。

namespace Qi\Bss\BaseBundle\Lib\PurchaseModule; 

use Qi\Bss\BaseBundle\Entity\Business\PurchaseModule\PmodLog; 
use Qi\Bss\BaseBundle\Entity\Business\PurchaseModule\PmodOrder; 

use Doctrine\ORM\Event\LifecycleEventArgs; 

/** 
* Class OrderLogger. Purchase Module activity logger. 
*/ 
class OrderLogger 
{ 
    /** 
    * Service container 
    * @var type 
    */ 
    private $serviceContainer; 

    /** 
    * Performs tasks before destruction 
    * @ORM\PostPersist 
    */ 
    public function postPersist(LifecycleEventArgs $args) 
    { 
     $order = $args->getEntity(); 

     if ($order instanceof PmodOrder) { 
      $logRecord = new PmodLog(); 

      $user = $this->serviceContainer->get('security.token_storage')->getToken()->getUser(); 

      $logRecord->setCreatedBy($user); 
      $logRecord->setAction('Gemaak'); 
      $logRecord->setCreatedAt(new \DateTime()); 
      $logRecord->setOrder($order); 
      $logRecord->setDepartment($user->getDepartment()); 
     } 
    } 

    /** 
    * Sets the sales order exporter object 
    * @param type $serviceContainer 
    */ 
    public function setServiceContainer($serviceContainer) 
    { 
     $this->serviceContainer = $serviceContainer; 
    } 
} 

私が間違っていることを得られず、データベースのログテーブルが更新されません。

私のサービスもここにあります。

bss.pmod.logger: 
    class: Qi\Bss\BaseBundle\Lib\PurchaseModule\OrderLogger 
    calls: 
    - [ setServiceContainer, [@service_container] ] 
    tags: 
     - { name: doctrine.event_listener, event: postPersist } 

エラーは発生しません。注文は完全に作成されますが、ログデータベースは空のままです。

答えて

0

さてあなたは、する必要はありませんがフラッシュ$logRecordを持続しますか?エンティティマネージャは$argsから取得できます。

+0

ああ!ありがとうございました!私はそれを知っていたし、 '$ em = $ this-> getDoctrine() - > getManager();'を試してみましたが、これはコントローラでのみ有効でしょうか? 私は '$ args'からエンティティマネージャを得ることができないと知りました。 –

+0

http://www.doctrine-project.org/api/orm/2.1/class-Doctrine.ORM.Event.LifecycleEventArgs.htmlを参照してください。 – dlondero

0

これをあなたのものに適応させることができます。誰かがUserエンティティを作成した直後に、Userエンティティのデータを挿入することによって、新しいUserLogエンティティ/レコードが作成されます。

コントローラ

public function createAction() 
{ 
    $user = new User(); 
    $user->setUsername('username'); 
    $user->setPassword('password'); 

    $this->entityManager->persist($user); 
    $this->entityManager->flush(); 
} 

Services.yml

​​

UserEntityListener.php

namespace Application\BackendBundle\EventListener; 

use Application\BackendBundle\Entity\User; 
use Application\BackendBundle\Entity\UserLog; 
use Doctrine\ORM\Event\LifecycleEventArgs; 

class UserEntityListener 
{ 
    public function postPersist(LifecycleEventArgs $args) 
    { 
     $entity = $args->getEntity(); 

     if ($entity instanceof User) { 
      $log = new UserLog(); 
      $log->setUserId($entity->getId()); 
      $log->setMessage('postPersist at ' . date('d/m/Y H:i:s')); 

      $em = $args->getEntityManager(); 
      $em->persist($log); 
      $em->flush(); 
     } 
    } 
} 
+0

ありがとう!私は@ dlonderoの答えからうまく動作するようにしましたが、あなたも同様にトリックをやったでしょう。私のアップヴォーヴを持ってください(私は15人の代理人を得る時に表示されます)。 –

+0

私はあなたがイベントリスナー内のものを洗い流すべきではないと思う。今は2回目の潮吹きです。最初はリスナーでポストペリストにバインドされ、その後コントローラーで(ただしこれは何もフラッシングしません)。私は、リスナーでflush()を削除し(ただし、永続性を保持する)、コントローラにflush()を処理させます。 – VaN

関連する問題