2013-06-21 3 views
2

으로Gedmo Timestampable 주석, 이벤트 리스너 그래서

을 작업 표시되지 않습니다 나는 기업은 그래서 같은 Timestampable 필드로 설정이 : 다음에 대한 라이프 사이클 가입자를 설정 한

<?php 
namespace Acme\Bundle\Entity; 

use Acme\PathEnumerableInterface as EnumerableInterface; 
use Acme\PathEnumerable as PathEnumerableTrait; 

use Doctrine\ORM\Mapping as ORM; 
use Gedmo\Mapping\Annotation as Gedmo; 

/** 
* SomeEntity 
* 
* @ORM\Table() 
* @ORM\HasLifecycleCallbacks 
*/ 
class SomeEntity implements EnumerableInterface 
{ 
    use PathEnumerableTrait; 

    /** 
    * @var \DateTime 
    * 
    * @Gedmo\Timestampable(on="create") 
    * @ORM\Column(name="created_at", type="datetime") 
    */ 
    private $createdAt; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="updated_at", type="datetime") 
    * @Gedmo\Timestampable(on="update") 
    */ 
    private $updatedAt; 


    /** 
    * Get createdAt 
    * 
    * @return \DateTime 
    */ 
    public function getCreatedAt() 
    { 
     return $this->createdAt; 
    } 

    /** 
    * Get updatedAt 
    * 
    * @return \DateTime 
    */ 
    public function getUpdatedAt() 
    { 
     return $this->updatedAt; 
    } 
} 

postPersist, postUpdate 및 postFlush 이벤트. service.yml은 다음과 같습니다

services: 
    acme.element_listener: 
     class: %iacme.element_listener.class% 
     arguments: 
      manager: "@doctrine.orm.default_entity_manager" 
     tags: 
      - { name: doctrine.event_subscriber, connection: default } 

실제 리스너는 다음과 같습니다

<?php 

namespace Acme\Bundle\EventListener; 

use Acme\PathEnumerableInterface; 
use Doctrine\ORM\Event\LifecycleEventArgs; 
use Doctrine\ORM\EntityManager; 
use Doctrine\ORM\Event\PostFlushEventArgs; 

class EventListener 
{ 
    /** 
    * @var Doctrine\ORM\EntityManager 
    */ 
    private $entityManager; 

    /** 
    * @var array 
    */ 
    private $paths = []; 

    public function __construct(EntityManager $entityManager) 
    { 
     $this->entityManager = $entityManager; 
    } 

    public function getSubscribedEvents() 
    { 
     return ['postPersist']; 
    } 

    private function postPersist(LifecycleEventArgs $args) 
    { 
     $entity = $args->getEntity(); 
     // Set $newPath to a generated path and check so we don't end up in an infinite loop 
     if ($entity->getPath() != $newPath) { 
      //... Do some stuff with the entity 
      $this->entityManager->persist($entity); 
      $this->entityManager->flush(); 
     } 
    } 
} 

내가 이벤트 리스너를 제거하면 모든 것이 잘하고 timestampable 필드가 올바르게 채워집니다. 그러나 리스너를 사용하여 새 엔티티를 만들면 타임 스탬프 가능 필드가 채워지지 않습니다.

제 질문은 이벤트 리스너가 Gedmo에서 타임 스탬프 필드를 채우지 않게하는 원인은 무엇입니까? 아마 정말 어리석은 일을하고 있어요,하지만 아직 그게 될 일을 볼 수 없습니다 ...

답변

1

좋아, 그래서 나에게 문제의 원인이 된 잘못된 여기에 몇 가지가 있었다 :

  1. My EventListener 클래스가 EventSubscriber를 구현하지 않았습니다. 클래스 과 같이 선언되어 있어야합니다 :

    <?php 
    
    namespace Acme\Bundle\EventListener; 
    
    use Acme\PathEnumerableInterface; 
    use Doctrine\ORM\Event\LifecycleEventArgs; 
    use Doctrine\ORM\EntityManager; 
    use Doctrine\ORM\Event\PostFlushEventArgs; 
    use Doctrine\Common\EventSubscriber; 
    
    class EventListener implements EventSubscriber 
    { 
        // ..... 
    } 
    
  2. 당신은 구조 인수로 EntityManager를 전달할 수 없습니다. 이것은 실제로 생각할 때 꽤 의미가 있습니다. 그리고 getEntityManager 이벤트가 LifecycleEventArgs 객체 및 PostFlushEventArgs 객체에서 사용 가능할 때 실제로하는 일을 방해하지 않습니다.