src/Event/AdminApiEventSubscriber.php line 34

Open in your IDE?
  1. <?php
  2. namespace App\Event;
  3. use App\Controller\AdminApi\AbstractAdminApiController;
  4. use App\Event\ApiException;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpFoundation\JsonResponse;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  9. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  10. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  11. use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
  12. use Symfony\Component\HttpKernel\Exception\NotAcceptableHttpException;
  13. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  14. use Symfony\Component\HttpKernel\KernelEvents;
  15. class AdminApiEventSubscriber implements EventSubscriberInterface {
  16.   private $api_host;
  17.   private $env;
  18.   
  19.   public function __construct($api_host$env) {
  20.     $this->api_host $api_host;
  21.     $this->env $env;
  22.   }
  23.   
  24.   public static function getSubscribedEvents() {
  25.     return [
  26.       KernelEvents::EXCEPTION => 'onKernelException',
  27.       KernelEvents::CONTROLLER => 'onKernelController',
  28.     ];
  29.   }
  30.   public function onKernelController(ControllerEvent $event) {
  31.     $c $event->getController();
  32.     $controller is_array($c) ? $c[0] : $c;
  33.     if(!$controller || !($controller instanceof AbstractAdminApiController)) return;
  34.   }
  35.   
  36.   public function onKernelException(ExceptionEvent $event) {
  37.     $r $event->getRequest();
  38.     if($r->getHost() != $this->api_host) return;
  39.     
  40.     $ex $event->getThrowable();
  41.     $data = [
  42.         'status' => Response::HTTP_INTERNAL_SERVER_ERROR,
  43.         'error' => "Unknown error"
  44.     ];
  45.     
  46.     if($this->env == "dev") {
  47.       $data['error'] = "[DEBUG ENV] ".$ex->getMessage();
  48.       $data['stack'] = $ex->getTrace();
  49.     }
  50.     
  51.     switch(true) {
  52.       case $ex instanceof NotFoundHttpException:
  53.       case $ex instanceof AccessDeniedHttpException:
  54.       case $ex instanceof MethodNotAllowedHttpException:
  55.       case $ex instanceof NotAcceptableHttpException:
  56.         $data['status'] = $ex->getStatusCode();
  57.         $data['error'] = $ex->getMessage();
  58.         break;
  59.       case $ex instanceof ApiException:
  60.         $data['status'] = Response::HTTP_BAD_REQUEST;
  61.         $data['error'] = $ex->getMessage();
  62.         break;
  63.     }
  64.     $event->setResponse(new JsonResponse($data$data['status']));
  65.   }
  66. }