<?php
namespace Customize\EventListener;
use Exception;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Customize\Exception\DenyProductException;
class ExceptionEventLintener implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
// return the subscribed events, their methods and priorities
return [
KernelEvents::EXCEPTION => [
['productCartAddException', 10],
],
];
}
/**
* 商品購入時に発生させた例外のレスポンスを設定する。
* 本番環境では例外を汎用テンプレートで拾うため、カスタム例外の場合はそれをさせないようにする。
*
* @param ExceptionEvent $event
* @return void
*/
public function productCartAddException(ExceptionEvent $event)
{
$exception = $event->getException();
if (empty($exception)) {
return;
}
$className = get_class($exception);
$code = $exception->getCode();
$message = $exception->getMessage();
if ($exception instanceof DenyProductException) {
$result = [
'class' => $className,
'code' => $code,
'detail' => $message,
];
$event->setResponse(new Response(json_encode($result), 500));
}
}
}