主义事件post_persist

时间:2014-12-13 15:52:30

标签: php symfony doctrine-orm doctrine

我创建了一个这样的事件:

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活动。

我的问题是

  • 为什么我在活动期间没有在我的数据库中拥有新用户?
  • 我不了解Listener / Subscriber之间的主要区别。在这种情况下,哪个更好?

1 个答案:

答案 0 :(得分:2)

  

为什么我的活动期间我的数据库中没有新用户?

那是因为当时没有提交DB事务。如果你看一下Doctrine的一个炉子,UnitOfWork::commit() function你会看到在你的情况下执行以下操作:

  1. 派遣preFlush事件。
  2. 派遣onFlush事件。
  3. 打开数据库事务。
  4. 致电executeInserts()

    1. 执行实际INSERT s。
    2. 派遣postPersist事件。
  5. 提交交易。这是您的数据在RDBMS中对其他人(交易)可见的时刻。

  6. 派遣postFlush事件。
  7.   

    我不明白Listener / Subscriber之间的主要区别。在这种情况下,哪个更好?

    它们实现完全相同的两种不同方式。在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);
        }
    }
    

    我想说在这种情况下,两者在“哪一个更好”方面是相同的。