2012-04-26 1 views
6

:Symfony 2 예외를 무시 하시겠습니까? 따라서 이러한 문서 페이지

http://symfony.com/doc/current/cookbook/controller/error_pages.html

심포니 예외의 표시를 제어하는 ​​TwigBundle을 이용한다. 그러나, 나는 디스플레이를 사용자 지정하려면 의사가 언급 한대로, 나는 이것을 무시 찾고 있습니다. 작은 REST API에서 일하고 있는데 TwigBundle의 호출을 내 번들에 덮어 써서 내 예외 처리 (REST : 올바른 HTTP 상태 코드 및 일반 텍스트 본문 응답 매핑)를 만들고 싶었습니다.

나는 이것에 관해서 아무 것도 찾을 수 없었고, 매뉴얼에있는 참고 문헌은 특별히 커널 부분에는 좋지 않다. 어쩌면 누군가가 이미 이것을했고 나를 도울 수 있습니까? 감사.

답변

11

사용자가 수신하는 리스너를 작성해야합니다 (대신 두 번째를 만드는 handle 방법을 대체 할 수 있습니다) JSON 요청 심포니에 의해 내부 예외 캐치를 해제 내 AppKernel.php의 일부입니다 kernel.exception 이벤트. 그 청취자의 onKernelException 방법에서 당신은 ... 예를 들어

예외 리스너 클래스에

//namespace declarations 
    class YourExceptionListener 
    { 

     public function onKernelException(GetResponseForExceptionEvent $event) 
     { 
     $exception = $event->getException(); 
     if ($exception instanceof YourException) { 
      //create response, set status code etc. 
      $event->setResponse($response); //event will stop propagating here. Will not call other listeners. 
     } 
     } 
    } 

이 서비스 선언이 조금 hackish 것 같다

//services.yml 
kernel.listener.yourlisener: 
    class: FQCN\Of\YourExceptionListener 
    tags: 
    - { name: kernel.event_listener, event: kernel.exception, method: onKernelException } 
+0

내 번들의 루트에 리스너를 둘 수 있습니까? – vinnylinux

+0

작동하지 않았지만 예외를 재정의하지 않았습니다. – vinnylinux

+0

디버그 모드 도구 모음 프로파일 러 페이지에서. 왼쪽에서 이벤트 탭을 선택하십시오. 청취자 목록이 표시됩니다. 청취자가 있는지 확인하십시오. –

1

우는 소리는

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpKernel\HttpKernelInterface; 
use Symfony\Component\HttpKernel\Kernel; 
use Symfony\Component\Config\Loader\LoaderInterface; 

class AppKernel extends Kernel { 
    public function init() { 
    parent::init(); 

    if ($this->debug) { 
     // workaround for nasty PHP BUG when E_STRICT errors are reported 
     error_reporting(E_ALL); 
    } 
    } 

    public function handleForJson(Request $request, 
           $type = HttpKernelInterface::MASTER_REQUEST, 
           $catch = true 
) { 
    return parent::handle($request, $type, false); 
    } 
    ... 
+1

것입니다 귀하의 예외 중 하나를 확인하실 수 있습니다 다른 방법은? – vinnylinux

+0

OOP convetion을 사용하는 확장 클래스가 hackish인가요? – sbczk

+0

"OOP convention"의 의미를 모르십니까? 프레임 워크 클래스를 덮어 쓰지 않는 것이 좋습니다. KernelEvents :: EXCEPTION은 handleResponse의 맨 처음에 발생하므로 프레임 워크 클래스를 수정하는 대신 리스너에서 리스닝 할 수 있습니다. – smentek