2012-04-27 4 views
9

이 튜토리얼의 지침 (http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html)을 수행하고 엔터티의 삽입 또는 업데이트시 Doctrine에서 전달한 이벤트를 수신하는 간단한 수신기를 만들었습니다. preInsert 및 postInsert 이벤트는 올바르게 작동하고 새 엔터티를 만들 때 전달됩니다. 그러나 preUpdate와 postUpdate는 엔티티의 업데이트에 관계없이 호출됩니다. onFlush도 마찬가지입니다. 부수적으로, 기본 CRUD 작업을 지원하는 콘솔 생성 컨트롤러가 있으며, 그대로 두었습니다.doctrine 2에서 preUpdate 및 postUpdate 이벤트가 트리거되지 않음

다음은이 작업을 수행하는 데 필요한 몇 가지 코드 조각입니다.

config.yml

annotation.listener: 
    class: City\AnnotatorBundle\Listener\AnnotationListener 
    tags: 
     - { name: doctrine.event_listener, event: postUpdate} 

리스너 구현 (나는 다른 기능을 생략하고 단순 목적으로 만 postUpdate 왼쪽)

class AnnotationListener 
{ 

    public function postUpdate(LifecycleEventArgs $args) 
    { 
     $entity=$args->getEntity(); 

     echo $entity->getId(); 
     die; 
    } 
} 

는 엔티티 ID가 표시되지 않습니다, 그리고 스크립트는 계속 함수가 끝날 때까지 다이에도 불구하고 실행이 완료 될 때까지 실행됩니다.

답변

13

@HasLifecycleCallbacks annotaion을 추가하는 것을 잊었습니까? 주석과 건너 뛰기 서비스 정의를 모두 @PreUpdate 사용할 수 있습니다. 제 생각에는

/** 
* @ORM\Entity 
* @ORM\HasLifecycleCallbacks 
*/ 
class YouEntity 
{ 

    /** 
    * @ORM\PrePersist() 
    * @ORM\PreUpdate() 
    */ 
    public function preUpdate(){ 
     // .... your pre-update logic here 
    } 
    .... 
} 

이벤트를 부착의 방법은 새로운 서비스와 청취자 명시 적으로을 정의 할 필요가 없습니다만큼 쉽습니다. 또한이 메소드는 엔티티 내의 위치이므로 업데이트중인 데이터에 직접 액세스 할 수 있습니다. 그러나 ... 사실 http://symfony.com/doc/master/cookbook/doctrine/file_uploads.html#using-lifecycle-callbacks

+2

을 :

이제 수명주기 여기 콜백에 대해

당신은 자세한 내용을보실 수 있습니다 ... 단점은 당신이 당신의 모델과 논리를 혼합 것입니다 그리고 가능하면 피해야한다 뭔가 다른 엔티티와 엔티티 관리자 자체 및 기타 서비스를 사용해야하므로 좋은 생각이 아닙니다. 어쨌든 이제는 문제가 해결 된 것 같습니다. 최신 버전의 Symfony로 업데이트하고, 캐시를 지우고, 모든 것이 작동합니다. – tomor

+0

아, 네가 다른 서비스/엔티티를 사용한다면이 방법을 사용하지 않는 것이 좋다. :) –

관련 문제