Доктрина в Symfony 2: прослушивание событий от определенной сущности - PullRequest
7 голосов
/ 10 февраля 2012

У меня есть Учение (Новости), которое я слушаю для события prePersist.Для этого я использую прослушиватель событий с методом prePersist.

Мой services.yml выглядит следующим образом:

listener.entity.news:
    class: A\BBundle\Listeners\Entity\NewsListener
    tags:
        - { name: doctrine.event_listener, event: prePersist }

Это нормально, и все работает.Но в документации говорится, что когда вызывается persist(), возникает событие prePersist.Тогда, как указано в моей конфигурации, NewsListener перехватит его и выполнит некоторый код.Внутри метода, где я улавливаю событие, я должен проверить, происходит ли событие от сущности News.Вот где я задаюсь вопросом: можно ли сказать Symfony прослушивать события prePersist для конкретной сущности и затем передавать ее моему слушателю?

В настоящее время (насколько я понимаю), когда доктрина порождает prePersistСобытие ВСЕ слушатели уведомляются.Разве не лучше сказать, какие слушатели должны слушать, какие инициаторы событий, даже если это должно быть необязательным, вместо того, чтобы уведомлять всех и позволять им фильтровать те, которые им нужны?

Надеюсь, я правильно задал свой вопрос.

Ответы [ 4 ]

21 голосов
/ 20 марта 2013

Похоже, что это поддерживается начиная с Doctrine 2.4:

http://docs.doctrine -project.org / projects / doctrine-orm / en / latest / reference / events.html # entity-listeners

6 голосов
/ 22 апреля 2016

Это возможно начиная с Doctrine 2.4 с функцией Entity listener .

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\EntityListeners({"AppBundle\EntityListener\PostListener"})
 */
class Post
{
}

namespace AppBundle\EntityListener;

use Doctrine\ORM\Mapping as ORM;

class PostListener
{
    public function preUpdate() {  }

    // or

    /** @ORM\PreUpdate */
    public function someOtherName() {  }
}

Что, если я хочу ввести зависимость в слушателя? Возможно ли это?

Да, это возможно, начиная с DoctrineBundle 1.3. Вам просто нужно зарегистрировать прослушиватель сущностей как сервис и пометить его тегом doctrine.orm.entity_listener .

class PostListener
{
    public function __construct(SomeDependency $someDependency) {  }
}

services:
    app.post_listener:
        class: AppBundle\EntityListener\PostListener
        arguments: ["@app.some_dependency"]
        tags:
            - { name: doctrine.orm.entity_listener }

Альтернативный метод

Начиная с DoctrineBundle 1.5, вы можете регистрировать прослушиватели сущностей через теги , но этот метод еще не задокументирован . Этот метод не требует привязки слушателя к аннотации EntityListeners.

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Post
{
}

namespace AppBundle\EntityListener;

class PostListener
{
    public function __construct(SomeDependency $someDependency) {  }

    public function preUpdate() {  }

    public function someOtherName() {  }
}

services:
    app.post_listener:
        class: AppBundle\EntityListener\PostListener
        arguments: ["@app.some_dependency"]
        tags:
            - { name: doctrine.orm.entity_listener, entity: AppBundle\Entity\Post, event: preUpdate }
            # or
            - { name: doctrine.orm.entity_listener, entity: AppBundle\Entity\Post, event: preUpdate, method: someOtherName }
4 голосов
/ 10 февраля 2012

можно ли сказать Symfony прослушивать события prePersist для определенной сущности и затем передать его моему слушателю?

Нет, это невозможно.Ваш слушатель будет стрелять за каждую существующую сущность.Вы должны сделать instanceof проверку в приемнике событий, чтобы убедиться, что ваш код работает только для определенной сущности.

0 голосов
/ 11 февраля 2012

В зависимости от того, что вы делаете в своем слушателе, вы можете использовать обратные вызовы жизненного цикла в сущности News и реализовать ловушку prePersist.

http://docs.doctrine -project.org / проекты / Доктрина-ОРМ / ен / 2.0.x / ссылки / events.html # жизненный цикл обратных вызовов

Таким образом, слушатель будет вызываться только для экземпляра, который в данный момент сохраняется.

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