vendor/friendsofsymfony/rest-bundle/Controller/TwigExceptionController.php line 26

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 Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\Templating\EngineInterface;
  13. use Twig\Environment;
  14. use Twig\Error\LoaderError;
  15. use Twig\Loader\ExistsLoaderInterface;
  16. /**
  17.  * Custom ExceptionController that uses the view layer and supports HTTP response status code mapping.
  18.  * It additionally is able to prepare the template parameters for the core EngineInterface.
  19.  *
  20.  * @deprecated since FOSRestBundle 2.8
  21.  */
  22. class TwigExceptionController extends TemplatingExceptionController
  23. {
  24.     /**
  25.      * {@inheritdoc}
  26.      */
  27.     protected function createView(\Exception $exception$code, array $templateDataRequest $request$showException)
  28.     {
  29.         $view parent::createView($exception$code$templateData$request$showException);
  30.         $view->setTemplate($this->findTemplate($request$code$showException), false);
  31.         return $view;
  32.     }
  33.     /**
  34.      * {@inheritdoc}
  35.      *
  36.      * This code is inspired by TwigBundle and should be synchronized on a regular basis
  37.      * see src/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php
  38.      */
  39.     protected function findTemplate(Request $request$statusCode$showException)
  40.     {
  41.         $format $request->getRequestFormat();
  42.         $name $showException 'exception' 'error';
  43.         if ($showException && 'html' == $format) {
  44.             $name 'exception_full';
  45.         }
  46.         // For error pages, try to find a template for the specific HTTP status code and format
  47.         if (!$showException) {
  48.             $template sprintf('@Twig/Exception/%s%s.%s.twig'$name$statusCode$format);
  49.             if (
  50.                 ($this->templating instanceof EngineInterface && $this->templating->exists($template)) ||
  51.                 ($this->templating instanceof Environment && $this->templateExists($template))
  52.             ) {
  53.                 return $template;
  54.             }
  55.         }
  56.         // try to find a template for the given format
  57.         $template sprintf('@Twig/Exception/%s.%s.twig'$name$format);
  58.         if (
  59.             ($this->templating instanceof EngineInterface && $this->templating->exists($template)) ||
  60.             ($this->templating instanceof Environment && $this->templateExists($template))
  61.         ) {
  62.             return $template;
  63.         }
  64.         // default to a generic HTML exception
  65.         $request->setRequestFormat('html');
  66.         return sprintf('@Twig/Exception/%s.html.twig'$showException 'exception_full' $name);
  67.     }
  68.     /**
  69.      * See if a template exists using the modern Twig mechanism.
  70.      *
  71.      * This code is based on TwigBundle and should be removed when the minimum required
  72.      * version of Twig is >= 3.0. See src/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php
  73.      */
  74.     private function templateExists(string $template): bool
  75.     {
  76.         $loader $this->templating->getLoader();
  77.         if ($loader instanceof ExistsLoaderInterface || method_exists($loader'exists')) {
  78.             return $loader->exists($template);
  79.         }
  80.         try {
  81.             $loader->getSourceContext($template)->getCode();
  82.             return true;
  83.         } catch (LoaderError $e) {
  84.         }
  85.         return false;
  86.     }
  87. }