событие домена Symfony - PullRequest
       12

событие домена Symfony

6 голосов
/ 07 ноября 2011

Я пытаюсь реализовать Domain Driven Design в моем проекте Symfony2 и испытываю некоторые проблемы.Прочитав несколько статей о моделях доменов, я обнаружил, что

  • Я должен поместить всю бизнес-логику в свои доменные модели (сущности).
  • Материал уровня приложения, который необходимо сделатьи не относится к доменной логике, запускается с помощью событий домена (отправка электронной почты, помещение некоторых сообщений в очередь и т. д.)

К счастью, Symfony предоставляет события, но здесь есть проблема - я могуПоднимите событие от моего лица.Документация Symfony предлагает использовать DI для внедрения диспетчера в класс, который вызывает событие

http://symfony.com/doc/current/book/internals.html#passing-along-the-event-dispatcher-object

Но сущности Symfony являются новыми, а не вводимыми.Прямо сейчас я вижу два способа:

1) Предоставить объекту диспетчера событий, подобным этому

class FooEntity
{
    protected $dispatcher = null;

    public function setEventDispatcher(EventDispatcher $dispatcher)
    {
        $this->dispatcher = $dispatcher;
    }
}

2) Поднять события из службы (не от сущности).

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

Ответы [ 2 ]

2 голосов
/ 20 апреля 2012

Идея этого здесь в том, чтобы дать пути для достижения парадигмы DDD.

Я не хочу скрывать ответ @magnusnordlander, я буду применять то, что он говорит.

Вотнекоторые наблюдения по этому вопросу:

Я думаю, что у самой сущности не должно быть всего.Это точно не то, что люди DDD сказали бы так или иначе.Сущность [Doctrine2] должна заботиться только о отношениях ( сущности с другими вариациями <= Это на самом деле то, что я застрял на некоторое время) и <a href="http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/aggregate-fields.html" rel="nofollow"> Совокупный корень .

Сущность Доктрины должна знать только о том, как работать с собой.

Но, чтобы получить данные или работать с ними, есть и другие вещи, которые вы можете использовать:

Репозиторий

Это то, что предоставляет помощникичтобы получить ваши более сложные искатели, чем то, что сделал бы быстрый findBy(array('id'=>$idvalue)) (и что сущность / Ассоциация / Аннотация не может охватить), и это действительно отличныйвещь, чтобы иметь под рукой.

Я лично пытался построить все запросы и понял, что EntityManager уже очень хорош, из коробки. В большинстве случаев, на мой взгляд : если вы можете / не можете / использовать запрос или построитель запросов, тем лучше.

Бизнес-логика во всем этом ...

Последнее, что следует заметить, то, что вы будете искать, - это, в основном, разбавление контроллера.

FooManager (например) - это где (если я не ошибаюсь)бизнес-логика идет.

Я нашел золотую жилу информации по этому вопросу в этом блоге , которая охватывает:

Если у вас есть какие-либо идеи, для дополнения, я задаю этот ответ в качестве вики сообщества

2 голосов
/ 08 ноября 2011

Под сущностями Symfony вы имеете в виду сущности Doctrine 2? Если это так, вы можете настроить службы как для новых, так и для старых объектов, загружаемых из базы данных, следующим образом:

Сервис прототипа

Службы в области действия прототипа всегда воссоздаются при их получении. Вместо new FooEntity вы бы $container->get('foo_entity').

В синтаксисе YAML вы определяете службу следующим образом:

foo_entity:
  class: FooEntity
  calls: 
    - [setEventDispatcher, [@event_dispatcher]]
  scope: prototype

Это позаботится о новых сущностях. Для существующих объектов вам нужно ...

Прослушиватель событий после загрузки

Создайте прослушиватель событий, как описано здесь:

http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html

Пусть слушатель прослушает postLoad событие. Вставьте диспетчер событий в службу прослушивателя и используйте службу прослушивателя, чтобы установить диспетчер событий для объекта.

Имейте в виду, что служба приемника будет запускаться после загрузки любого объекта, а не только объекта FooEntity, поэтому вам необходимо выполнить проверку типа.

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