Symfony3注册异常监听器

时间:2017-06-05 19:42:57

标签: php symfony symfony-3.2

我有一个Stripe异常包装器,用于Stripe根据某些情况可能抛出的所有异常。我试图为抛出的异常注册一个事件监听器,但看起来听起来似乎没有被触发。

异常抛出500并呈现堆栈跟踪,而不是在json响应中返回事件。我有什么遗失的东西吗?

// AppBundle/Exceptions/StripePaymentException.php
namespace AppBundle\Exceptions;

use Exception;

class StripePaymentException extends Exception {

    public $response;
    public $message;

    public function __construct($message, $response, $code = 0, Exception $previous = null)
    {
        parent::__construct($message, $code);

        $this->message = $message;
        $this->response = $response;
    }

    public function getResponse()
    {
        return $this->$response;
    }

}

// AppBundle/EventListener/StripePaymentExceptionListener.php
namespace AppBundle\EventListener;

use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;

class StripePaymentExceptionListener
{
    public function onKernelException(GetResponseForExceptionEvent $event)
    {
        $exception = $event->getException();
        $data = $exception->getResponse();
        $response = new JsonResponse($data);
        $event->setResponse($response);
    }
}

// services.yml
app.stripe_payment_exception_listener:
class: AppBundle\EventListener\StripePaymentExceptionListener
    tags:
        - { name: kernel.event_listener, event: kernel.exception, priority: 200 }

1 个答案:

答案 0 :(得分:0)

可能是您的自定义侦听器上的priority设置。如果你有另一个在之前被解雇的侦听器,那么这将永远不会返回异常。

您可以在此处更改priority

// services.yml
app.stripe_payment_exception_listener:
class: AppBundle\EventListener\StripePaymentExceptionListener
    tags:
        - { name: kernel.event_listener, event: kernel.exception, priority: 1 }

或者您可以根据捕获的异常类型将您的“标准”ExceptionListener更改为fork:

if(instanceof $exception STRIPE_EXCEPTION_CLASS)
    $data = $exception->getResponse();
    $response = new JsonResponse($data);
    $event->setResponse($response);
}
else {
    //"normal" behavior here
}

...或基于Accept标题

的类型
//if you're accepting json, return json
if( $accept->has('application/json') ) {
    $response = new Response(json_encode($data, JSON_FORCE_OBJECT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
    $response->headers->set('Content-Type', 'application/json; charset=utf-8');
    $event->setResponse($response);
}
//if accepting xml, return xml..
elseif( $request->isXmlHttpRequest() ) {
    $xml = new \SimpleXMLElement('<exception/>');
    $data = array_flip($data);
    array_walk_recursive($data, array ($xml, 'addChild'));
    $response = new Response($xml->asXML());
    $response->headers->set('Content-Type', 'text/xml; charset=utf-8');
    $event->setResponse($response);
}