php - Doctrine 事件 post_persist

标签 php symfony doctrine-orm doctrine

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

服务.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(); 我在数据库中找不到新用户。毕竟我在数据库中有新用户。

从文档 Doctrine 中,我可以阅读

postPersist - The postPersist event occurs for an entity after the entity has been made persistent. It will be invoked after the database insert operations. Generated primary key values are available in the postPersist event.

我的问题是

  • 为什么在事件期间我的数据库中没有新用户?
  • 我不明白监听者/订阅者之间的主要区别。这种情况下,怎样做比较好呢?

最佳答案

Why I don't have new user in my Database during my Event?

那是因为当时数据库事务尚未提交。如果你看一下 Doctrine 的壁炉,UnitOfWork::commit() function您将看到在您的情况下执行了以下操作:

  1. 调度 preFlush 事件。
  2. 调度 onFlush 事件。
  3. 打开数据库事务。
  4. 调用executeInserts()

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

  6. 调度 postFlush 事件。

I don't understand the main difference between Listener/Subscriber. In this case,what is the better?

它们几乎是实现完全相同的两种不同方法。对于事件监听器,您可以从外部世界配置它们,伪代码:

$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);
    }
}

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

关于php - Doctrine 事件 post_persist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27460708/

相关文章:

php - Dynamics CRM 2011 SOAP RetrieveMultiple 查询忽略条件

php - PHP 最好的 IDE 是什么?

symfony - Twig :{% block %} 并扩展

php - 正确的对象实例化/持久化排序和注释

javascript - 使用 jquery 从 td 元素中删除 div 和 table

php - 使用 PHP 从 Windows Azure 容器获取所有文件

php - Symfony/serializer 在对象中标准化对象

symfony - Symfony Messenger/RabbitMQ 中的消费者错误处理

php - Doctrine 2 - 持久实体与连接表的外键反对外国实体

symfony - 如何指定用于 Doctrine 2.2/Symfony 2.2 和 PostgreSQL 的模式?