Symfony2 - слушатели по учению / орму - PullRequest
4 голосов
/ 08 июня 2011

Каков наилучший способ иметь событие, которое запускается после вставки записи в Symfony2 / Doctrine?

Ответы [ 2 ]

10 голосов
/ 08 июня 2011

Сначала зарегистрируйте службу в качестве прослушивателя событий 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 здесь (устарела, но включена для справки) /

1 голос
/ 16 мая 2013

Попробуйте ввести сам контейнер вместо контекста безопасности.с 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, или я просто ошибаюсь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...