Symfony: лучшее место для перехвата исключений (CQRS / DDD)

#php #symfony

#php #symfony

Вопрос:

У меня есть личное приложение. Я использую шаблон проектирования CQRS / DDD для API.

Схема: Пользователь -> Контроллер (команда отправки) -> Обработчик команд -> некоторые службы…

В моем контроллере Rest API

 $this->dispatch($cmd);
 

Например, если a выдает исключение в классах служб или спецификаций, хорошо, у меня есть прослушиватель для перехвата исключения и создания ошибки ответа JSON.

Но если я хочу разработать интерфейсный модуль с TWIG, я думаю, что не буду использовать свой слушатель, потому что мне не нужен ответ JSON.

Должен ли я использовать try / catch в моем контроллере моего нового интерфейсного модуля?

 SomeController extends AbstractController
{
    public function getObject($id)
    {
         try {
            $this->dispatch($cmd);
        catch(SomeException $ex) {
            $this->render(....)
        } 
    }
}
 

Где лучшее место для перехвата исключений для TWIG?

Спасибо.

Редактировать:

@Cid if (некоторые условия amp;amp; $form->handleRequest($request)->isValid()) -> Мой обработчик не возвращает bool или значения.

Представьте себе этот код. Представьте, что я хочу поделиться сервисом между API и приложением для просмотра веб-страниц.

 class ApiController
{
    public function register()
    {
        $this->dispatch($cmd);
    }
}

class WebController
{
    public function register()
    {
        $this->dispatch($cmd);
    }
}

class SomeHandler implements CommandHandlerInterface
{

    /** @required */
    public RegisterService $service;

    public function __invoke(SomeCommand $command)
    {
        $this->service->register($command->getEmail())
    }
}

class RegisterService
{
    public function register(string $email)
    {
        // Exception here
    }
}
 

Комментарии:

1. Какие исключения? являются ли они исключениями Symfony, связанными с каким-либо HTTP-кодом?

2. Например, Nop: пользователь хочет зарегистрироваться в моем приложении из представления формы. В моем сервисе я проверяю, не существует ли имя пользователя, адрес электронной почты. Я создаю исключение, если электронная почта уже существует.

3. В этом примере какой шаблон вы хотите отобразить? Представление реестра с сообщением об ошибке?

4. Да, это возможно.

5. Я думаю, вы усложняете себя, Symfony уже справляется с этим. Я полагаю, в вашем контроллере регистра у вас есть что-то вроде : if (some conditions amp;amp; $form->handleRequest($request)->isValid()) { /* add the user */ return someRoute } return render the register view . $form уже содержит сообщения об ошибках (сгенерированные $form->handleRequest($request)->isValid() ), которые можно использовать в представлениях {{ form_label(form.user.email, "Email", {'label_attr': {'class': 'control-label'}}) }} , уже содержит потенциальное сообщение об ошибке

Ответ №1:

Итак, я думаю, что лучшим местом для обработки исключений является EventSubscriber, смотрите Здесь: https://symfony.com/doc/current/reference/events.html#kernel-exception

 use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentHttpKernelEventExceptionEvent;

public function onKernelException(ExceptionEvent $event)
{
    $exception = $event->getThrowable();
    $response = new Response();
    // setup the Response object based on the caught exception
    $event->setResponse($response);

    // you can alternatively set a new Exception
    // $exception = new Exception('Some special exception');
    // $event->setThrowable($exception);
}
 

Комментарии:

1. Да, для API хорошо, но для веб-приложения использовать TWIG?

2. Вы можете отобразить шаблон здесь и создать ответ, Google: пользовательская страница ошибок Symfony