customize 403 error page depening on route in symfony 2.0

前端 未结 2 559
不思量自难忘°
不思量自难忘° 2020-12-21 01:47

i want to customize the error pages in Symfony 2.0

I know that this is done via overwriting the layouts in app/Resources/TwigBundle/views/Exception/* bu

相关标签:
2条回答
  • 2020-12-21 01:52

    i use arguments: ["@twig", "%kernel.debug%"] instead of arguments: [@twig, %kernel.debug%]

    0 讨论(0)
  • 2020-12-21 02:14

    What you'll need to do is not too difficult. Symfony allows you to explicitly specify which controller handles your exceptions. So, in your config.yml, you can specify the exception controller under your twig configuration:

    since Symfony 2.2

    twig:
       exception_controller:  my.twig.controller.exception:showAction
    
    services:
        my.twig.controller.exception:
            class: AcmeDemoBundle\Controller\ExceptionController
            arguments: [@twig, %kernel.debug%]
    

    up to Symfony 2.1:

    twig:
      exception_controller: AcmeDemoBundle\Controller\ExceptionController::showAction
    

    Then you can create a custom showAction that displays a custom error page based on a route:

    <?php
    namespace AcmeDemoBundle\Controller;
    
    use Symfony\Component\HttpKernel\Exception\FlattenException;
    use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Bundle\TwigBundle\Controller\ExceptionController as BaseExceptionController;
    
    class ExceptionController extends BaseExceptionController
    {
        public function showAction(FlattenException $exception, DebugLoggerInterface $logger = null, $format = 'html')
        {
            if ($this->container->get('request')->get('_route') == "abcRoute") {
                $appTemplate = "backend";
            } else { 
                $appTemplate = "frontend";
            }
    
            $template = $this->container->get('kernel')->isDebug() ? 'exception' : 'error';
            $code = $exception->getStatusCode();
    
            return $this->container->get('templating')->renderResponse(
                'AcmeDemoBundle:Exception:' . $appTemplate . '_' . $template . '.html.twig',
                array(
                    'status_code'    => $code,
                    'status_text'    => Response::$statusTexts[$code],
                    'exception'      => $exception,
                    'logger'         => null,
                    'currentContent' => '',
                )
            );
        }
    }
    

    Obviously you should probably customize the if statement where it tests the current route to fit your needs, but this should do it.

    You might want to add code that defaults to the normal Twig error pages if you don't have a specific error template created. For more information, check out the code in

    Symfony\Bundle\TwigBundle\Controller\ExceptionController
    

    as well as

    Symfony\Component\HttpKernel\EventListener\ExceptionListener
    
    0 讨论(0)
提交回复
热议问题