Ошибочно полагать, что CQRS — это какое-то «расширение» CQS. Эти два слова только и роднит, что общее название. CQRS про модели, CQS про методы. Метод у command bus вполне может что-то возвращать, те же события. Некая идея о разделении «команд» и «запросов» роднит на очень далеком уровне. Под «командами» и «запросами» тут понимаются очень разные вещи.Просто если говорить об упрощенном CQS (без комманд баса и разделения на команду и хандлер), то кода получается в разы меньше и это проще использовать c другими одаренными разработчиками. Вот я и думаю как сделать с точки зрения кода, чтобы и писать было немного как при CQS, но был более менее полноценный CQRS.
Я правильно понимаю, что есть только один класс команды куда передается контекст (в котором параметры для хандлеров) и id команды и команда может вернуть объект результата выполнения хандлеров и/или содержать массив ошибок их выполнения (типа $command->erros и т.д.)?Единый интерфейс для команд: с command id, без; требование context-объекта (что-то типа https://beberlei.de/2017/03/12/explicit_global_state_with_context_objects.html), возвращаемые значения (события, ошибки, etc.).
Просто я вот думаю я правильно понял @Вурдалак насчет единой команды, куда параметры команды передаются через контекст, и с добавлением уникального команд ид или нет. И использует еще кто-то такое или нет. Просто такой подход значительно уменьшает количество почти идентичных классов команд, но я не уверен что правильно понялНу да. А какие еще варианты? На php это немного задаблывает, да.
откуда такой вывод?Т.е. отдельная dto-шка только для единоразового использования - значит что-то не так с этой dto-шкой и передать данный можно было как-то иначе.
class SomeUser {
// и конструктор присвающий эти значения, лень писать
public $name;
public $email;
}
//.....
class SomeClass {
public function someMethod () {
// создание этого класса только в этом месте и все, больше нигде в коде встречаться не будет
$user = new SomeUser ('User Name', '[email protected]');
$this->userMethod($user);
}
public function userMethod (SomeUser $user) {
// делаем что-то в почтой и именем
// но метод вызывается и используется только один раз в $this->someMethod и это 100% известно что не будет меняться
}
}
class SomeClass {
public function someMethod () {
$this->userMethod('User Name', '[email protected]');
}
public function userMethod ($name, $email) {
// делаем что-то в почтой и именем
// но метод вызывается и используется только один раз в $this->someMethod и это 100% известно что не будет меняться
}
}
Я то понимаю все плюсы, проблема в том что когда известны поставленные задачи и заранее известно, что 90% всех команд будут из команды и одного хандлера и никаких отложенных выполнений, никаких очередей и т.д. А остальные 10% будут для добавления дополнительного логирования через еще один дополнительный хандлер. Все.абстракция комманд баса дает некоторые преимущества...
Еще раз попытаюсь объяснить. У меня куча команд с разными параметрами. Но 90% из них это команды из одного хандлера, который используется только в этой конкретной команде.У тебя в приложении всего одна команда с единственным параметром?
(new SomeCommand($param1, $param2))->registerHandler(new SomeCommandHandler())->exec();
(new SomeCommandWithIncludedHandler($param1, $param2))->exec();
(new SomeCommandWithIncludedHandler($param1, $param2))->registerHandler(new SomeCommandSecondHandler())->exec();