Symfony2 — слушатели на доктрине/форме

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


person user761540    schedule 07.06.2011    source источник


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

person Derek Stobbe    schedule 07.06.2011
comment
Я делаю то же самое, но пытаюсь включить ссылку на объект securityContext в свой слушатель. Я добавил: arguments: [@security.context] в свой файл yml, но когда я добавляю объект $securityContext в свой конструктор, я получаю циклическую ошибку ссылки. Любые идеи? Я использую FOSUserBundle, и это отображается в ошибке, которую я получаю. - person Jeremy; 26.09.2011
comment
Вот ошибка, которую я получаю. ServiceCircularReferenceException: Обнаружена циклическая ссылка для службы security.context, путь: profiler_listener -> профайлер -> security.context -> security.authentication.manager -> fos_user.user_manager -> доктрина.orm.default_entity_manager -> доктрина.dbal.default_connection -> мой.слушатель. - person Jeremy; 26.09.2011

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

person David Lin    schedule 16.05.2013