2017-04-06 43 views
1

我做了以下的監聽:Symfony的:在不同環境下用戶定製的監聽變化響應

namespace AppBundle\EventListener; 

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

class ExceptionListener 
{ 
    public function onKernelException(GetResponseForExceptionEvent $event) 
    { 
     // You get the exception object from the received event 
     $exception = $event->getException(); 
     $message = array(
      'message'=>$exception->getMessage(), 
      'code'=>$exception->getCode(), 
      'stacktrace'=>$exception->getTrace() 
     ); 

     // Customize your response object to display the exception details 
     $response = new Response(); 
     $response->setContent(json_encode($message,JSON_PRETTY_PRINT)); 

     // HttpExceptionInterface is a special type of exception that 
     // holds status code and header details 
     if ($exception instanceof HttpExceptionInterface) { 
      $response->setStatusCode($exception->getStatusCode()); 
      $response->headers->replace($exception->getHeaders()); 
     } else { 
      $response->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR); 
      $response->headers->set('content/type','application/json'); 
     } 

     // Send the modified response object to the event 
     $event->setResponse($response); 
    } 
} 

偵聽器時異常根據我services.yml發生上述被炒魷魚:

parameters: 
services: 
app.exception_listener: 
    class: AppBundle\EventListener\ExceptionListener 
    tags: 
    - { name: kernel.event_listener, event: kernel.exception } 

現在我想要實現的是在生產時從其他環境顯示不同的json輸出。我的意思是,對於最終用戶/ api使用者來說,看到堆棧跟蹤並不明智。

那麼你有什麼想法我怎麼知道我什麼時候在生產和當我在開發環境?

回答

2

可以kernel.environment參數簡單地傳遞給你的類的構造函數:

app.exception_listener: 
    class: AppBundle\EventListener\ExceptionListener 
    arguments: ["%kernel.environment%"] 
    tags: 
    - { name: kernel.event_listener, event: kernel.exception } 

然後在你的類:

class ExceptionListener 
{ 
    private $env; 

    public function __construct($env) 
    { 
     $this->env = $env; 
    } 

    public function onKernelException(GetResponseForExceptionEvent $event) 
    { 
     if ($this->env == 'dev') { 
      // do something 
     } else { 
      // do something else 
     } 
    } 
}