2014-12-13 43 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();我不在我的數據庫中找到新用戶。畢竟我有數據庫中的新用戶。

從技術文檔的教義,我可以讀

postPersist - 在 實體已經被持久化後的postPersist事件發生時一個實體。它將在數據庫 插入操作後調用。生成的主鍵值在 postPersist事件中可用。

我的問題是

  • 我爲什麼不是我的事件時有我的數據庫新用戶?
  • 我不明白聽者/訂閱者之間的主要區別。在這種情況下,有什麼更好的?

回答

2

爲什麼我的活動中沒有新用戶在我的數據庫中?

這是因爲當時沒有提交數據庫事務。如果您在學說的爐看看,UnitOfWork::commit() function你會看到你的情況執行以下操作:

  1. 調度preFlush事件。
  2. 發貨onFlush事件。
  3. 打開數據庫事務。
  4. 呼叫executeInserts()

    1. 執行實際INSERT秒。
    2. 調度postPersist事件。
  5. 提交交易。這是您的數據在RDBMS中對其他人(交易)可見的時刻。

  6. 調度postFlush事件。

我不明白Listener/Subscriber之間的主要區別。在這種情況下,有什麼更好的?

他們幾乎是兩種不同的方式來實現完全相同。在事件偵聽器的情況下,你從外面的世界,僞配置它們:

$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

完美的Crozin!這就是我一直在尋找的東西 – Twinsen 2014-12-13 16:54:05