Я создаю небольшое приложение с Silex . Он разделен между приложением REST и веб-сайтом. ( два контроллера , одно приложение). На веб-сайте установлен собственный собственный обработчик ошибок , который возвращает удобную страницу html. Проблема в том, что в части, посвященной REST-приложению, я должен каким-то образом обрабатывать исключения типа return [json] и контента, отличного от пользовательского веб-сайта обработчика ошибок.
Этот аргумент может быть применен и к Symfony2, я также хотел бы, чтобы это было возможным решением!
Оберните методы в блок try-catch, чтобы переустановить исключение для обработчика.
$app->get('/api/show-list', function() use($app){ try { $show = // db query, etc. return $app->json(array('show' => $show), 200); } catch (Exception $e) { throw new MyException; } }); $app->error(function (MyException $e, $code) { // error api });
Проблема в том, что если исключение выбрасывается из моего контролера, будет использоваться обработчик ошибок по умолчанию. Некоторые советы? И с Симфонией?
Я использовал следующее в моем приложении Silex RESTful для возврата ошибок в формате json:
$app->error(function (\Exception $e, $code) use($app) { return $app->json(array("error" => $e->getMessage()),$code); });
Не уверен, что это правильный путь, но он работает для меня.
Это описано на сайте Silex: http://silex.sensiolabs.org/doc/usage.html#error-handlers
На Symfony2 вы можете использовать ExceptionHandler. В Exception у вас есть трассировка стека, поэтому вы можете определить, где она была выбрана.
Кроме того, в Symfony2 вы можете настроить в зависимости от ожидаемого формата. Это хорошо объяснено в документации .
Например, если вы замените ExceptionController на один из ваших, третий параметр отобразит ожидаемый формат:
Ссылка на замену ExceptionController
API ExceptionController