#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