2014-12-13 1 views
2

Я создал событие так:Доктрина событие post_persist

service.yml

AccountManager: 
    class: %AccountManager.class% 
    tags: 
     - { name: doctrine.event_listener, event: postPersist } 

мой подписчик

class AccountManager implements EventSubscriber 
{ 
    public function getSubscribedEvents() 
    { 
     return array(
      'postPersist', 
      'postUpdate', 
     ); 
    } 

    public function postUpdate(LifecycleEventArgs $args) 
    { 
     $this->index($args); 
    } 

    public function postPersist(LifecycleEventArgs $args) 
    { 
     $this->index($args); 
    } 

    public function index(LifecycleEventArgs $args) 
    { 
     $entity = $args->getEntity(); 
     $entityManager = $args->getEntityManager(); //BREAKPOINT 

     if ($entity instanceof User) { 

      echo $entity; 
     } 
    } 
} 

Если я вижу свой код, где я добавил точку останова, $entityManager = $args->getEntityManager(); я дону» t найти нового пользователя в моей базе данных. В конце концов, у меня новый пользователь в базе данных.

Из документации доктрины, я могу читать

postPersist - Событие postPersist происходит для объекта после того, как объект был достигнут упорным. Он будет вызываться после базы данных операций вставки. Сгенерированные значения первичного ключа доступны в событии postPersist .

Мои вопросы

  • Почему у меня нет нового пользователя в моей базе данных во время моего события?
  • Я не понимаю основную разницу между слушателем/подписчиком. В этом случае, что лучше?

ответ

2

Почему у меня нет нового пользователя в моей базе данных во время моего мероприятия?

Это потому, что транзакция DB не была совершена в то время. Если вы посмотрите на сердце доктрины, UnitOfWork::commit() function вы увидите, что в вашем случае выполняются следующие операции:

  1. Отправка preFlush события.
  2. Отправка onFlush Событие.
  3. Открытая транзакция БД.
  4. Вызов executeInserts()

    1. Выполняет фактические INSERT с.
    2. Отправка postPersist Событие.
  5. Заключить сделку. Это тот момент, когда ваши данные становятся видимыми для других (транзакций) в РСУБД.

  6. Отправка postFlush Событие.

Я не понимаю основную разницу между слушателем/подписчиком. В этом случае, что лучше?

Это почти два разных способа достижения точно такого же.В случае EventListeners настроить их от внешнего мира, псевдокода:

$ed = new EventDispatcher(); 
$ed->addListener('some.event', $myObject, 'myMethod'); // $myObject::myMethod listens 
                 // to some.event 

$ed->addSubscriber($myObject); // ask $myObject for events it wants to listen to 

// EventDispatcher::addSubscriber could look like this 

function addSubscriber(EventSubscriber $object) { 
    foreach ($object->getSubscribedEvents() as $event => $method) { 
     $this->addListener($event, $object, $method); 
    } 
} 

Я бы сказал, что оба они равны с точки зрения «который один лучше» в данном случае.

+0

Perfect Crozin! это то, что я искал – Twinsen

Смежные вопросы