2017-04-06 10 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 } 

今何I達成したいのは、生産時に他の環境からの別の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 
     } 
    } 
} 
関連する問題