根据 symfony 2.0 中的路由自定义 403 错误页面

Posted

技术标签:

【中文标题】根据 symfony 2.0 中的路由自定义 403 错误页面【英文标题】:customize 403 error page depening on route in symfony 2.0 【发布时间】:2012-12-26 07:15:27 【问题描述】:

我想自定义 Symfony 2.0 中的错误页面

我知道这是通过覆盖 app/Resources/TwigBundle/views/Exception/* 中的布局来完成的,但我希望为不同的路线提供不同的错误页面。

我想要一个用于后端,一个用于前端。

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

您需要做的事情并不太难。 Symfony 允许您明确指定哪个控制器处理您的异常。因此,在您的 config.yml 中,您可以在 twig 配置下指定异常控制器:

自 Symfony 2.2 起

twig:
   exception_controller:  my.twig.controller.exception:showAction

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

直到 Symfony 2.1:

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

然后你可以创建一个自定义的 showAction 来显示一个基于路由的自定义错误页面:

<?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' => '',
            )
        );
    

显然,您可能应该自定义 if 语句来测试当前路由以满足您的需求,但应该这样做。

如果您没有创建特定的错误模板,您可能希望添加默认为正常 Twig 错误页面的代码。有关更多信息,请查看

中的代码
Symfony\Bundle\TwigBundle\Controller\ExceptionController

还有

Symfony\Component\HttpKernel\EventListener\ExceptionListener

【讨论】:

感谢您的回复。像魅力一样工作。【参考方案2】:

我用 arguments: ["@twig", "%kernel.debug%"] 代替 arguments: [@twig, %kernel.debug%]

【讨论】:

以上是关于根据 symfony 2.0 中的路由自定义 403 错误页面的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 2.0 - 如何使用数组参数创建路由?

Symfony 形式的奏鸣曲字段类型

从 Symfony 3.4 迁移到 Symfony 4.4 后,自定义投票器无法按预期工作

为什么Symfony 5.1无法识别在“ routes.php”文件上配置的路由?

Symfony:控制器工厂

如何在 symfony 路由中自动化函数名?