В терминах путаетесь. Что метод в классе XxxController, что ваш класс XxxAction, что анонимка function ($request) отдельно - по глобальной терминологии это всё "контроллер". А "жирный" или "тонкий" - это про корректность его реализации по ответственностям.
Да, для API можно освободить контроллер от рутины:BrusSENS писал(а): ↑2019.05.30, 02:03 Я же говорю, логгер - это прикладная штука и высокоуровневой она быть не может. Он только и делает, что принятую строку пишет куда-то. Если он этого не делает, но его объект существует, то тут мы просто тратим ресурсы в пустую. + можно написать свой обработчик исключений и варнингов, для продакшна вполне хватит. И приложение об этом логгере не знает, как и должно. И при чём тут UI что-то не понял. Зачем логи в UI выводить?..
Повторюсь ещё раз о том, что можно собственный обработчик исключений сделать, это дело нескольких минут. И да, через композер такой обработчик подключу в проект и при необходимости смогу полностью выпилить.
Код: Выделить всё
class Api\TaskController
{
public function start(Task $task, Request $request, Start\Handler $handler): Response
{
$command = new Start\Command($task->getId());
$handler->handle($command);
return $this->json([]);
}
}
Код: Выделить всё
class DomainExceptionHandlerMiddleware
{
public function __invoke(Request $request, callable $next): Response
{
try {
return $next($request);
} catch (DomainException $e) {
$this->errorHandler->handle($e);
return $this->json(['error', $e->getMessage()], 400);
}
}
}
Код: Выделить всё
class Api\TaskController
{
public function assign(Task $task, Request $request, Executor\Assign\Handler $handler): Response
{
$command = new Executor\Assign\Command($task->getId());
$form = $this->createForm(Executor\Assign\Form::class, $command);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
try {
$handler->handle($command);
$this->addFlash('success', 'Member is successfully assigned.');
return $this->redirectToRoute('tasks.show', ['id' => $task->getId()]);
} catch (DomainException $e) {
$this->errorHandler->handle($e);
$this->addFlash('error', $e->getMessage());
}
}
return $this->render('tasks/assign.html.twig', [
'task' => $task,
'form' => $form->createView(),
]);
}
}
Немного за другой хардкод зависимости ругали.
Создателии всех языков как раз и придумали исключения для работы с исключительными ситуациями. А в PHP ими пользоваться по назначению до сих пор не научились и сам язык с ними до сих пор не очень подружили, оставив мультипарадигменным.
Увы, но нет у PHP конструкций для структур данных и перечислений. Вот многие гвозди и приходится как-то мылом забивать.BrusSENS писал(а): ↑2019.05.30, 02:03 Только и читаешь, как в PHP придумали как мылом гвозди забивать. Не хочу никого обидеть, но стали уже просто с ума сходит с принципами каноничной архитектуры. А в итоге видал, как один клоун делал классы для того, что бы текстовые константы имели тип. Он об SPL даже не знает, зато о DDD пишет (если найду ссыль на эту статью, обязательно скину).
Да, я в курсе, что в Yii не ничего из мной перечисленного. Я вообще говорю о разных вариантах.BrusSENS писал(а): ↑2019.05.30, 02:03 В случае Yii, данный прикладной сервис относится к действию, нежели к контроллеру. Зачем тащить в контроллер зависимость, которая нужна для 1 действия из всех? Для этого, в реалиях Yii2 подходят прекрасно StandAlone экшены. Свой конструктор, никакого лишего кода логики из других действий, свои методы, которые доступны только для данного действия.
Это было бы и сейчас реально делать контроллер с одним экшеном, если бы маршрутизация от этого не страдала.