@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);
}
  • Вопрос задан
  • 301 просмотр
Решения вопроса 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/"
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
25 апр. 2024, в 15:51
3000 руб./за проект
25 апр. 2024, в 15:31
70000 руб./за проект
25 апр. 2024, в 15:26
15000 руб./за проект