我按照说明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行
这款控制器在经典视图下运行良好。
答案 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扩展。