Symfony:将错误403,500,...重定向到404页面

时间:2016-08-19 11:31:30

标签: php apache .htaccess symfony redirect

我按照说明here进行了自定义error.html.twig(第3个案例)。我也做了一个自定义控制器。

我有两个问题:

第一个问题 我在哪里放置自定义控制器?我不明白这个文档:https://symfony.com/doc/current/controller/error_pages.html#overriding-the-default-exceptioncontroller

第二个问题 我正在尝试将403,500,...错误重定向到此页面。实际上,当您尝试访问文件夹时,您有“禁止访问”。

我尝试在.htaccess:ErrorDocument 403 http://www.xxx.fr/中添加此内容,但我不知道404页面的URL是什么。

修改

好的,我知道把控制器放在哪里,但是我收到了错误。

这是我的 ExceptionController.php

namespace Symfony\Bundle\TwigBundle\Controller;

use Symfony\Component\Debug\Exception\FlattenException;
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;


class ExceptionController
{
    public function showAction()
    {
        $dir = $this->get('kernel')->getRootDir() . '/../web/images/theme/404/';
        $dh  = opendir($dir);
        $errorFiles = array();
        while (false !== ($filename = readdir($dh)))
            if ($filename != '.' && $filename != '..' && $filename[0] != '.')
                $errorFiles[] = $filename;

        shuffle($errorFiles);

        return $this->render('errors/show.html.twig', [
                    'gifs' => $errorFiles
        ]);
    }
}

错误

  

糟糕,看起来出了问题。

     

ExceptionController.php第30行中的1/1 UndefinedMethodException:   试图调用一个名为“get”类的未定义方法   “的Symfony \包\ TwigBundle \控制器\ ExceptionController”。在   ExceptionController.php第30行

这款控制器在经典视图下运行良好。

1 个答案:

答案 0 :(得分:0)

  • 第一个问题:您必须将它放在捆绑包和app / config / config.yml文件中:

    twig:
          exception_controller:  NameofMyBundleWhereIsTheControllerBundle:Exception:showException
    
  • 第二个问题:在cookbook中陈述的最好方法是创建自己的事件监听器,监听kernel.exception事件并呈现页面。默认情况下,Twig提供的异常侦听会捕获此异常。你可以这样做:

    <?php
    use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
    use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
    use Symfony\Component\HttpFoundation\Response;
    
    public function onKernelException(GetResponseForExceptionEvent $event)
    {
        if ($event->getException() instanceof HttpExceptionInterface) {
           $response = $this->templating->renderResponse(/* sitemap */);
    
           $event->setResponse($response)
        }
    }
    

    (我没有测试过这段代码,所以你应该自己尝试一下!当然,你必须自己将模板服务注入事件监听器。)

  • 第3个问题或您的修改:在文档中,它们是3种方式。您创建一个新的控制器,但您必须复制其中定义的所有方法。您扩展ExceptionController并只更改一些方法。第三种可能性是为它提供服务(我在第二个问题中说的话) 所以在你的情况下,你尝试第二个可能性,你忘了从ExceptionController扩展。