Intereting Posts
Доступ к списку каталогов FTP с помощью PHP Использование jQuery в шаблоне php Symfony2 Не удалось установить Cookie в curl Request PHP, как эхо-данные конкретных объектов из массива? как преобразовать дату hijri в gregorian date, используя php? Проверка подлинности электронной почты с использованием регулярного выражения в PHP Как хранить ежедневные записи из таблицы mysql в другую? Оптимизация XML DomDocument Встроенные изображения, превышающие длину Как проверить, что файл, загруженный с помощью php, не содержит исполняемый двоичный файл? PHP Catchable fatal error: объект класса не может быть преобразован в строку Как сделать $ _GET более безопасным? Как я могу расшифровать зашифрованное значение MCRYPT_RIJNDAEL_256 в C #, которое было зашифровано mcrypt в PHP? Бинарное хранилище MySQL с использованием файловой системы BLOB VS OS: большие файлы, большие количества, большие проблемы Symfony 2.3 – Пользовательские фатальные ошибки

поведение пользовательских исключений в symfony2

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

throw new \Exception('Error occurred with your request please try again'); 

Я автоматически получаю статус 500, а сообщение – как внутренняя ошибка сервера

Однако вместо этого я бы хотел, чтобы мой ответ включал мое сообщение об исключении, а не только внутреннюю ошибку сервера, поэтому для отображения чего-то вроде этого:

  { "error":{ "code":500, "message":"Error occurred with your request please try again" } } 

и, кроме того, возможно, некоторые дополнительные вещи, такие как электронная почта сама ошибка. Однако я только хочу, чтобы это произошло, когда я выбрал \ Exception, а не использовал что-то вроде

  throw new HttpException 

Любая помощь или идеи о том, как это сделать.

Я должен также упомянуть, что я не использую Twig или любые шаблоны для этого. Это строго ответ типа API

Solutions Collecting From Web of "поведение пользовательских исключений в symfony2"

Взгляните на http://symfony.com/doc/current/cookbook/controller/error_pages.html. Для начала вам достаточно информации.

Короче говоря, вы должны создать приложение / Resources / TwigBundle / views / Exception / exception.json.twig и там у вас есть доступ к exception.message и error_code.

вот решение для вас:

 {% spaceless %} { "error":{ "code": {{ error_code }}, "message":{{ exception.message }} } } {% endspaceless %} 

Другим решением является использование Exception Listener:

 namespace Your\Namespace; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; class JsonExceptionListener { public function onKernelException(GetResponseForExceptionEvent $event) { $exception = $event->getException(); $data = array( 'error' => array( 'code' => $exception->getCode(), 'message' => $exception->getMessage() ) ); $response = new JsonResponse($data); $event->setResponse($response); } } 

обновите конфигурацию своих сервисов:

 json_exception_listener: class: Your\Namespace\JsonExceptionListener tags: - { name: kernel.event_listener, event: kernel.exception, method: onKernelException, priority: 200 } 

ура

Если вы хотите прочитать сообщение, которое вы отправляете обратно, вам нужно вернуть код ответа, который возвращает текст с ответом, например, 200. Таким образом, вы можете сделать что-то вроде этого с помощью блока try catch :

 try{ //..... throw new \Exception('Error occurred with your request please try again'); }catch(\Exception $ex){ $return = array('error'=>array('code'=>500,'message'=>$ex->getMessage())); return new Response(json_encode($return),200,array('Content-Type' => 'application/json')); } 

и на стороне клиента вы должны получить объект json точно так же, как вы указали, что хотите.

еще лучше, вы можете делать разные вещи, в зависимости от того, какое исключение выбрано

 }catch(\Exception $ex){ $class = get_class($ex); if($class == 'Symfony\Component\HttpKernel\Exception\HttpException'){ // create a response for HttpException }else{ // create a response for all other Exceptions } }