【问题标题】:Doctrine event post_persist教义事件 post_persist
【发布时间】:2014-12-13 15:52:30
【问题描述】:

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

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 之间的主要区别。在这种情况下,哪个更好?

【问题讨论】:

    标签: php symfony doctrine-orm doctrine


    【解决方案1】:

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

    那是因为当时没有提交数据库事务。如果您查看 Doctrine 的壁炉,UnitOfWork::commit() function 您会看到在您的案例中执行了以下操作:

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

      1. 执行实际的INSERTs。
      2. 发送postPersist事件。
    5. 提交事务。这就是您的数据在 RDBMS 中对其他人(事务)可见的时刻。

    6. 发送postFlush事件。

    我不明白 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);
        }
    }
    

    我想说,在这种情况下,就“哪个更好”而言,它们两者是相等的。

    【讨论】:

    • 完美的 Crozin !这就是我一直在寻找的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多