我创建了一个这样的事件:
服务.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您将看到在您的情况下执行了以下操作:
- 调度
preFlush
事件。 - 调度
onFlush
事件。 - 打开数据库事务。
调用
executeInserts()
- 执行实际的
INSERT
。 - 调度
postPersist
事件。
- 执行实际的
提交事务。这就是您的数据对 RDBMS 中的其他人(事务)可见的时刻。
- 调度
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/