Задать вопрос
@AlpineMilk

Как взаимодействовать с разными контекстами через события?

Всем привет, изучаю ddd и возник такой вопрос по ивентам. Допустим есть 2 контекста: user, panel. Создаем пользователя и создается событие UserWasCreatedEvent выбрасываем это событие где нибудь в очередь. Далее в другом контексте panel слушаем событие UserWasCreatedEvent из контекста user и что-нибудь делаем. И выходит что контекст panel имеет прямую зависимость из контекста user. Разве так это должно быть? Как можно избавится от этой зависимости к другому контексту?
Примерный код:
namespace User\Domain\Event;

class UserWasCreatedEvent
{
    // event data
}

---------------------------------------------

namespace Panel\Domain\Event;

use User\Domain\Event;

class UserWasCreatedEventHandler
{
    public function __invoke(UserWasCreatedEvent $createdEvent)
    {
        // do something
    }
}

---------------------------------------------

namespace Shared\Infrastructure\EventSubscriber\Doctrine;

class DomainEventSubscriber
{
    ...

    public function publish(): void
    {
        foreach ($this->entities as $entity) {
            foreach ($entity->releaseEvents() as $event) {
                $this->eventBus->dispatch($event);
            }
        }
    }
}
  • Вопрос задан
  • 147 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
Далее в другом контексте panel слушаем событие UserWasCreatedEvent из контекста user и что-нибудь делаем.


Слушать надо не в контексте panel, а, например, в контексте EventSubscriber:

namespace Shared\Infrastructure\EventSubscriber\Doctrine;

use User\Domain\Event\UserWasCreatedEvent;
use Panel\Domain\SomeHandler;
use Panel\Domain\SomeCommand;

class UserWasCreatedEventHandler
{
    private SomeHandler $handler;

    public function __construct(SomeHandler $handler)
    {
        $this->handler = $handler;
    }

    public function __invoke(UserWasCreatedEvent $createdEvent)
    {
        $this->handler->handle(new SomeCommand(
            $createdEvent->getId(),
            $createdEvent->getSomeInfo()
        ));
    }
}


Таким образом в этом месте связывается два независимых контекста. Паттерн "медиатор", если не ошибаюсь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽