我创建了一个这样的事件:
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活动。
我的问题是
答案 0 :(得分:2)
为什么我的活动期间我的数据库中没有新用户?
那是因为当时没有提交DB事务。如果你看一下Doctrine的一个炉子,UnitOfWork::commit()
function你会看到在你的情况下执行以下操作:
preFlush
事件。onFlush
事件。致电executeInserts()
INSERT
s。postPersist
事件。提交交易。这是您的数据在RDBMS中对其他人(交易)可见的时刻。
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);
}
}
我想说在这种情况下,两者在“哪一个更好”方面是相同的。