Каков наилучший способ получить событие, которое срабатывает после вставки записи в Symfony2/Doctrine?
Symfony2 — слушатели на доктрине/форме
Ответы (2)
Во-первых, зарегистрируйте службу в качестве прослушивателя событий Doctrine:
app/config.yml
:
services:
foo.listener:
class: Vendor\FooBundle\BarClass
tags:
- { name: doctrine.event_listener, event: postPersist, method: onPostPersist }
Затем в своем классе слушателя определите метод onPostPersist
(или как вы назвали метод в конфигурации), который принимает аргумент Doctrine\ORM\Event\LifecycleEventArgs
:
public function onPostPersist(LifecycleEventArgs $eventArgs)
{
// do stuff with the entity here
}
Обратите внимание, что вы не можете передать экземпляр EntityManager в класс слушателя, потому что $eventArgs содержит ссылку на него, и это вызовет исключение CircularReferenceException.
Документация по проекту Doctrine здесь. Документация проекта Symfony здесь (устарела, но включена для справки)/
Попробуйте внедрить сам контейнер вместо контекста безопасности. с FOS_USER, security.context зависит от вашего прослушивателя (EM), и ваш прослушиватель требует security.context.
<service id="foo.listener" class="%foo.listener.class%">
<argument type="service" id="service_container"/>
<tag name="doctrine.event_listener" event="postPersist" method="fooMethod" />
</service>
Кстати, по крайней мере, в XML имя метода, похоже, не работает, по умолчанию вместо этого вызывается метод «postPersist» и игнорируется любое имя метода, которое вы даете (fooMethod); Пожалуйста, дайте мне знать, так ли это в случае с конфигурацией YAML, или я просто ошибаюсь.