vendor/api-platform/core/src/Action/ExceptionAction.php line 29

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the API Platform project.
  4.  *
  5.  * (c) Kévin Dunglas <dunglas@gmail.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. declare(strict_types=1);
  11. namespace ApiPlatform\Core\Action;
  12. use ApiPlatform\Core\Util\ErrorFormatGuesser;
  13. use Symfony\Component\Debug\Exception\FlattenException as LegacyFlattenException;
  14. use Symfony\Component\ErrorHandler\Exception\FlattenException;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\Serializer\SerializerInterface;
  18. /**
  19.  * Renders a normalized exception for a given {@see FlattenException} or {@see LegacyFlattenException}.
  20.  *
  21.  * @author Baptiste Meyer <baptiste.meyer@gmail.com>
  22.  * @author Kévin Dunglas <dunglas@gmail.com>
  23.  */
  24. final class ExceptionAction
  25. {
  26.     private $serializer;
  27.     private $errorFormats;
  28.     private $exceptionToStatus;
  29.     /**
  30.      * @param array $errorFormats      A list of enabled error formats
  31.      * @param array $exceptionToStatus A list of exceptions mapped to their HTTP status code
  32.      */
  33.     public function __construct(SerializerInterface $serializer, array $errorFormats, array $exceptionToStatus = [])
  34.     {
  35.         $this->serializer $serializer;
  36.         $this->errorFormats $errorFormats;
  37.         $this->exceptionToStatus $exceptionToStatus;
  38.     }
  39.     /**
  40.      * Converts an exception to a JSON response.
  41.      *
  42.      * @param FlattenException|LegacyFlattenException $exception
  43.      */
  44.     public function __invoke($exceptionRequest $request): Response
  45.     {
  46.         $exceptionClass $exception->getClass();
  47.         $statusCode $exception->getStatusCode();
  48.         foreach ($this->exceptionToStatus as $class => $status) {
  49.             if (is_a($exceptionClass$classtrue)) {
  50.                 $statusCode $status;
  51.                 break;
  52.             }
  53.         }
  54.         $headers $exception->getHeaders();
  55.         $format ErrorFormatGuesser::guessErrorFormat($request$this->errorFormats);
  56.         $headers['Content-Type'] = sprintf('%s; charset=utf-8'$format['value'][0]);
  57.         $headers['X-Content-Type-Options'] = 'nosniff';
  58.         $headers['X-Frame-Options'] = 'deny';
  59.         return new Response($this->serializer->serialize($exception$format['key'], ['statusCode' => $statusCode]), $statusCode$headers);
  60.     }
  61. }