2015-11-30 5 views
3

У меня есть приложение Symfony, и я использую FOSRestBundle с AngularJS. Приложение My Symfony не имеет никаких просмотров.Symfony2, FOSRestBundle - исключение catch

Я хочу показать в сообщениях AngularJS информацию, полученную с сервера, с модулем ngToast.

Если я что-то создаю или обновляю, это легко показать. Но если сервер бросает какое-то исключение? Например, Угловой клиент пытается получить элемент с неправильным идентификатором или у этого пользователя нет доступа к этому действию? В этом случае сервер будет генерировать исключение, но я хочу показать соответствующее сообщение.

Может ли symfony уловить это исключение и, например, перевести его на объект Response? Например - если у меня нет доступа исключения Symfony должен поймать его и сделать что-то вроде этого:

return new Response(400, "You don't have permission to acces this route"); 

и Угловые получат:

{ 
    "code": 400, 
    "message": "You don't have permission to acces this route" 
} 

Возможно ли это? Как я должен это делать? Может быть, я должен сделать это по-другому.

+0

Возможно [дубликат] (http://stackoverflow.com/questions/30780089/how-do-you-customize-exception-format-with-fosrestbundle-and-symfony-2)? –

ответ

2

Да, конечно, это возможно. Я предлагаю вам реализовать простой прослушиватель Exception. И заставьте все ваши классы исключений расширить BaseException или реализовать BaseException, чтобы вы знали, какие исключения относятся к вашему «коду».

class ExceptionListener 
{ 
    public function onKernelException(GetResponseForExceptionEvent $event) 
    { 
     // You get the exception object from the received event 
     $exception = $event->getException(); 

     // Do your stuff to create the response, for example response status code can be exception code, and exception message can be in the body or serialized in json/xml. 

     $event->setResponse($response); 

     return; 
    } 

} 

Зарегистрируйте в контейнере:

<service id="your_app.listener.exception" class="App\ExceptionListener"> 
    <tag name="kernel.event_listener" event="kernel.exception" method="onKernelException" /> 
</service> 
4

Я хотел бы предложить, чтобы пойти для более FOSRestBundle подхода, который должен настроить исключения, и если необходимо или не показывать сообщения:

fos_rest: 
    exception: 
    enabled: true 
    codes: 
     'Symfony\Component\Routing\Exception\ResourceNotFoundException': HTTP_FORBIDDEN 
    messages: 
     'Symfony\Component\Routing\Exception\ResourceNotFoundException': true 

Допустим, у вас есть пользовательское AccessDeniedException для определенного действия, вы можете создать исключение и затем поместить его в конфигурацию.

<?php 
class YouCantSummonUndeadsException extends \LogicException 
{ 
} 

Где бы вы бросить его:

<?php 
throw new YouCantSummonUndeadsException('Denied!'); 

Вы можете настроить его:

codes: 
     'My\Custom\YouCantSummonUndeadsException': HTTP_FORBIDDEN 
    messages: 
     'My\Custom\YouCantSummonUndeadsException': true 

И получить результат, как:

{ 
    "code": 403, 
    "message": "Denied!" 
} 

Я надеюсь, что это делает его более четким !

Смежные вопросы