Как поймать все исключения, которые могут возникнуть в действии контроллера Symfony2? - программирование
Подтвердить что ты не робот

Как поймать все исключения, которые могут возникнуть в действии контроллера Symfony2?

Я пытаюсь создать веб-службу REST, которая возвращает JSON для всех вызовов. Обычно это довольно просто, я просто делаю это:

return new Response(json_encode($return_object));

Мой вопрос: как я должен перехватывать исключения глобальным способом? Я хочу сделать это, потому что, если исключение происходит где-нибудь в моем приложении, я все равно хотел бы вернуть сообщение JSON клиенту, в котором говорится в основном "Yo dawg, я слышал, что вам нравятся исключения". Мое мышление заключается в том, что возвращение JSON как в случае успеха, так и в случае сбоев упростит работу, которую любой клиент должен выполнить для реализации моего API.

Пока, единственное, о чем я могу думать, - написать каждое действие контроллера следующим образом:

public function generateMemeAction($arg1, $arg2) {
  $return_object = array();
  try {
    // stuff to generate meme here
    $return_object['status'] = "GREAT SUCCESS!";
  } catch (Exception $e) {
    // epic fail
    $return_object['status'] = "UnluckyBrianException";
  }
  return new Response(json_encode($return_object));
}

Это все замечательно и прекрасно, но этот блок try-catch будет одинаковым для каждого действия в моем приложении, и я буду чувствовать себя глупо каждый раз, когда мне приходится редактировать вокруг кучу макаронных изделий. Про советы?

4b9b3361

Ответ 1

Приложение REST имеет разные типы ошибок. Например. вы можете иметь логические ошибки или ошибки ввода (не все параметры были отправлены). Различные типы ошибок должны обрабатываться с использованием различных способов. Лучшим способом для этого случая является ручная обработка этих ошибок.

Вы можете добавить к вашему специальному методу ошибки Controller (и поместить его, например, в родительский класс), который вернет код ошибки + текст ошибки.

Но если вы хотите использовать автоматическую обработку, вы можете использовать прослушиватель Exception:

Вот пример:

use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Response;

public function onKernelException(GetResponseForExceptionEvent $event)
{
    $exception = $event->getException();
    $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->setException($exception);
}