2016-07-11 13 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

services: 
    application_backend.event_listener.user_entity: 
     class: Application\BackendBundle\EventListener\UserEntityListener 
     tags: 
       - { name: doctrine.event_listener, event: postPersist } 

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의 답변에서 일할 수있게되었지만, 당신도 트릭을했을 것입니다. 내 upvote (15 담당자를 얻을 때 표시됩니다). –

+0

이벤트 리스너 내부에서 물건을 플러시하지 말아야한다고 생각합니다. 지금, 청중에서 처음으로 두 번 홍조가 퍼스트 페르시스트에 바인딩 된 다음 컨트롤러에서 (이 하나는 아무것도 플러시하지 않습니다). 리스너에서 flush()를 제거하고 (지속성 유지) 컨트롤러가 flush()를 처리하도록합니다. – VaN

관련 문제