我有一个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 }
答案 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);
}