Всем привет,
В каких случаях стоит использовать commandBus? Стоит ли использовать его для обычного crud?
Я использую симфони и мне нравится компонент форм который он предоставляет.
public function new(Request $request): Response
{
$command = new CreateCurrencyCommand();
$form = $this->createForm(CurrencyType::class, $command);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->commandBus->handle($command);
return $this->redirectToRoute('admin_currency_index');
}
return $this->render('admin/currency/new.html.twig', [
'form' => $form->createView(),
]);
}
Содержимым формы является
CreateCurrencyCommand
(Обычная DTO которая содержит поля и геттеры/сеттеры) и создание валюты выглядит очень даже не плохо, очень тонкий контроллер и бизнес логика вынесена в отдельный обработчик, который создает сущность и сохраняет её в бд.
Проблема возникла когда я попробовал сделать то же самое для редактирования, главная проблема заключается в данных для формы, так как уже используется
CreateCurrencyCommand
вместо
UpdateCurrencyCommand
. Вот как выглядит метод редактирования без вмешательства команд
public function edit(Request $request, Currency $currency): Response
{
$form = $this->createForm(CurrencyType::class, $currency);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->getDoctrine()->getManager()->flush();
return $this->redirectToRoute('admin_currency_index');
}
return $this->render('admin/currency/edit.html.twig', [
'currency' => $currency,
'form' => $form->createView(),
]);
}
И тут я вижу 2 варианта:
1. Сделать универсальную команду без разделения на создание/редактирование/удаление (если делать по такому способу то как команду и обработчики лучше раскладывать по папкам?)
2. Сделать 2 формы для создания и редактирования и для каждой дать свою команду, что делать мне как-то не очень хочется.
3. Не использовать команды при crud операциях.
Это самый простой пример создания сущности. Для данного случая можно оставить как есть и метод не будет большим, но ведь не каждое создание выглядит так просто.
Посоветуйте как лучше поступить? И почему? Возможно стоит это делать каким нибудь другим способом который вы знаете.