vendor/friendsofsymfony/rest-bundle/Controller/ExceptionController.php line 64

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the FOSRestBundle package.
  4.  *
  5.  * (c) FriendsOfSymfony <http://friendsofsymfony.github.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. namespace FOS\RestBundle\Controller;
  11. use FOS\RestBundle\Util\ExceptionValueMap;
  12. use FOS\RestBundle\View\View;
  13. use FOS\RestBundle\View\ViewHandlerInterface;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\Debug\Exception\FlattenException;
  17. use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
  18. use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
  19. /**
  20.  * Custom ExceptionController that uses the view layer and supports HTTP response status code mapping.
  21.  */
  22. class ExceptionController
  23. {
  24.     /**
  25.      * @var ViewHandlerInterface
  26.      */
  27.     private $viewHandler;
  28.     /**
  29.      * @var ExceptionValueMap
  30.      */
  31.     private $exceptionCodes;
  32.     /**
  33.      * @var bool
  34.      */
  35.     private $showException;
  36.     public function __construct(
  37.         ViewHandlerInterface $viewHandler,
  38.         ExceptionValueMap $exceptionCodes,
  39.         $showException
  40.     ) {
  41.         $this->viewHandler $viewHandler;
  42.         $this->exceptionCodes $exceptionCodes;
  43.         $this->showException $showException;
  44.     }
  45.     /**
  46.      * Converts an Exception to a Response.
  47.      *
  48.      * @param Request                   $request
  49.      * @param \Exception|\Throwable     $exception
  50.      * @param DebugLoggerInterface|null $logger
  51.      *
  52.      * @throws \InvalidArgumentException
  53.      *
  54.      * @return Response
  55.      */
  56.     public function showAction(Request $request$exceptionDebugLoggerInterface $logger null)
  57.     {
  58.         $currentContent $this->getAndCleanOutputBuffering($request->headers->get('X-Php-Ob-Level', -1));
  59.         $code $this->getStatusCode($exception);
  60.         $templateData $this->getTemplateData($currentContent$code$exception$logger);
  61.         $view $this->createView($exception$code$templateData$request$this->showException);
  62.         $response $this->viewHandler->handle($view);
  63.         return $response;
  64.     }
  65.     /**
  66.      * @param \Exception $exception
  67.      * @param int        $code
  68.      * @param array      $templateData
  69.      * @param Request    $request
  70.      * @param bool       $showException
  71.      *
  72.      * @return View
  73.      */
  74.     protected function createView(\Exception $exception$code, array $templateDataRequest $request$showException)
  75.     {
  76.         $view = new View($exception$code$exception instanceof HttpExceptionInterface $exception->getHeaders() : []);
  77.         $view->setTemplateVar('raw_exception');
  78.         $view->setTemplateData($templateData);
  79.         return $view;
  80.     }
  81.     /**
  82.      * Determines the status code to use for the response.
  83.      *
  84.      * @param \Exception $exception
  85.      *
  86.      * @return int
  87.      */
  88.     protected function getStatusCode(\Exception $exception)
  89.     {
  90.         // If matched
  91.         if ($statusCode $this->exceptionCodes->resolveException($exception)) {
  92.             return $statusCode;
  93.         }
  94.         // Otherwise, default
  95.         if ($exception instanceof HttpExceptionInterface) {
  96.             return $exception->getStatusCode();
  97.         }
  98.         return 500;
  99.     }
  100.     /**
  101.      * Determines the template parameters to pass to the view layer.
  102.      *
  103.      * @param string               $currentContent
  104.      * @param int                  $code
  105.      * @param \Exception           $exception
  106.      * @param DebugLoggerInterface $logger
  107.      *
  108.      * @return array
  109.      */
  110.     private function getTemplateData($currentContent$code, \Exception $exceptionDebugLoggerInterface $logger null)
  111.     {
  112.         return [
  113.             'exception' => FlattenException::create($exception),
  114.             'status' => 'error',
  115.             'status_code' => $code,
  116.             'status_text' => array_key_exists($codeResponse::$statusTexts) ? Response::$statusTexts[$code] : 'error',
  117.             'currentContent' => $currentContent,
  118.             'logger' => $logger,
  119.         ];
  120.     }
  121.     /**
  122.      * Gets and cleans any content that was already outputted.
  123.      *
  124.      * This code comes from Symfony and should be synchronized on a regular basis
  125.      * see src/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php
  126.      *
  127.      * @return string
  128.      */
  129.     private function getAndCleanOutputBuffering($startObLevel)
  130.     {
  131.         if (ob_get_level() <= $startObLevel) {
  132.             return '';
  133.         }
  134.         Response::closeOutputBuffers($startObLevel 1true);
  135.         return ob_get_clean();
  136.     }
  137. }