Должен ли я вводить Command
а также EventBus
в Controller
или я должен сделать инъекцию Domain Service
в Controller
, и разреши Domain Service
создать Command
и отправить в Command Bus
?
Пример:
// CreateUserController.php
public function __construct (CreateUserCommand $command, CommandBus $cm) {
...
}
public function createAction(Request $request) {
// data validation
$this->command->setData($request->getData());
try {
$this->cm->handle($this->command)
} catch (Exception $e) {
return new Response(500) // assume Response accepts http code
}
return new Response(200);
}
Или лучше позвонить в доменную службу?
// CreateUserController.php
public function __construct (UserService $userService) {
...
}
public function createAction(Request $request) {
// data validation
$name = $request->getData()['name'];
$lastname = $request->getData()['lastname'];
try {
$this->userService->createUser($name, $lastname)();
} catch (Exception $e) {
return new Response(500) // assume Response accepts http code
}
return new Response(200);
}
Кажется, это лучше, потому что контроллер не несет ответственности за заполнение команды и вызов обработчика команды, он просто проверяет наличие необходимого ввода через форму и затем вызывает уровень службы домена.
Но тогда, если команды принадлежат к уровню представления, рабочий процесс будет:
Уровень представления (запрос) -> Домен (служба) -> Уровень представления (команда и обработчик команд) -> Домен -> Уровень представления (ответ)
CQRS заимствует много идей из домен приводом дизайн. Когда Эрик Эванс первоначально описал DDD в синяя книга, он работал с трехуровневой архитектурой: приложение / домен / постоянство.
Одной из ключевых абстракций является шов между приложением и доменом, который называется хранилищем. На этой границе взаимодействие обычно выглядит
$user = repository->getById($id)
$user->create($name, $lastName)
repository->save($user)
Обратите внимание, что вся логика домена скрыта где-то за $ user.
Если вы хотите взять этот блок кода и обернуть его в «службу», это нормально. Но это, как правило, считается служба приложений, а не доменная служба. Смотри Хорикова для обзор различия , или же Дубль джимми богарда.
Вы, возможно, захотите рассмотреть: команды, такие как http-запросы, по своей сути Сообщения. В течение срока службы ваших приложений определения этих сообщений могут изменяться. Вам нужно подумать о том, сколько разностных мест вам нужно изменить, чтобы код соответствовать новой схеме сообщения.
Других решений пока нет …