2017-06-05 101 views
0

對於Stripe可能根據某些情況拋出的所有異常,我有一個Stripe異常包裝。我試圖爲拋出的異常註冊一個事件監聽器,但似乎並沒有解僱這個監聽器。Symfony3註冊異常監聽器

不是在json響應中返回事件,而是拋出500並渲染堆棧跟蹤。有什麼我失蹤了嗎?

// 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

@AlessandroMinoccheri因此,異常被拋出,但它沒有按照我期待的方式(通過偵聽器)進行格式化。它拋出一個500,並呈現一個新的頁面,而不是僅僅返回一個響應。 – mashedpotatoes

回答

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到餐桌基於異常的抓類型:

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); 
} 
+0

我試着改變優先級。當我運行'php bin/console debug:event-dispatcher kernel.exception'時,StripePaymentExceptionListener是第一個按順序排列的。但是,當引發異常時,它似乎沒有觸及監聽器(嘗試放置xdebug斷點和var_dump,但都不起作用)。 – mashedpotatoes

+0

您是否嘗試過在調用setResponse之後添加'return'語句? –