@denlem
Programmer

Как избавиться от try-catch в контроллерах?

В REST-API проекте на Symfony есть куча контроллеров, где в каждом есть try-catch
Понятно, что это неправильно потому, что это повторяемость кода
Как избавиться от такого ***кода и вынести try-catch куда-то? Возможно вынести в отдельный метод либо есть другие удачные решения?

Пример роут метода контроллера:
/**
* @Route("/comment/create", name="comment_create", methods={"POST"})
*/
public function __invoke( Request $request ): JsonResponse {
  try {
    $data = $this->initRequestParams($request);
    $someService->doSomething($data);
  } catch (\Throwable $exception) {

    return new JsonResponse(['error' => 'Страница не найдена'], Response::HTTP_NOT_FOUND);
  }

  return new JsonResponse(null, Response::HTTP_CREATED);
}
  • Вопрос задан
  • 193 просмотра
Решения вопроса 1
myks92
@myks92 Куратор тега PHP
Нашёл решение — пометь вопрос ответом!
Смотря для чего вы делаете эти try catch. Это не всегда повторяемость иногда действительно нужна, например, чтобы перебросить своё исключение. Пойти можно разными способами. Но а простой - это вам нужно просто их убрать и сделать Listener или Subscriber, который будет обрабатывать ошибки и отдавать их в нужном формате в api. Если правильно понял для чего нужно. Пример.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
gzhegow
@gzhegow
aka "ОбнимиБизнесмена"
сделать мидлвар/слушатель, который вокруг контроллера, но просто его в коде не видно, он как правило часть фреймворка. или в index.php обернуть require что-то в try catch в одном единственном месте

try catch это же "поставить следилку, закрыть следилку, что делать с отслеживаемым". Не пиши их и их не будет. Респонсы ифами генерируй "if (! $content) return new JsonResponse();". А то что вы хотите эксепшен выбросить как JSON это не про конкретный трайкетч, это про "обработка ошибок в рамке папки с контроллерами по имени api/v1/"
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы