我想要显示/ sitemap页面,而不是错误页面/ 404。当然我不想重定向,我仍然希望设置404 HTTP响应头。
这可能吗?我只能看到如何在Twig中设置模板。
我绝对不想要重定向。
答案 0 :(得分:18)
如the Symfony Cookbook所示,您可以通过两种方式覆盖错误页面:
如果您只想在404(/sitemap
)例外显示HttpNotFoundException
路线,则可以通过在app/Resources/TwigBundle/views/Exception/error404.html.twig
中创建新模板来覆盖Twig例外模板。
另一种未在食谱中显示的方法是使用事件监听器。当内核遇到异常时,将调度kernel.exception
事件。默认情况下,Twig提供的异常侦听会捕获此异常。您可以create your own event listener收听kernel.exception
事件并呈现页面:
<?php
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Response;
public function onKernelException(GetResponseForExceptionEvent $event)
{
if ($event->getException() instanceof NotFoundHttpException) {
$response = $this->templating->renderResponse(/* sitemap */);
$event->setResponse($response)
}
}
(我没有测试过这段代码,所以你应该自己尝试一下!当然,你必须自己将模板服务注入到事件监听器中。)
答案 1 :(得分:0)
我有一个简单的Web应用程序,由几个Symfony3软件包组成,所有控制器都扩展了BaseController。我也有一个AdminBundle。为了显示每个不存在的url的给定页面,我攻击(并简化了)原始的ExceptionController.php(来自TwigBundle):
<?php
namespace MyApp\AdminBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use MyApp\Controller\BaseController;
use Symfony\Component\Debug\Exception\FlattenException;
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
class ExceptionController extends BaseController
{
/**
* Converts an Exception to a Response.
*
* @param Request $request The request
* @param FlattenException $exception A FlattenException instance
* @param DebugLoggerInterface $logger A DebugLoggerInterface instance
*
* @return Response
* @throws \InvalidArgumentException When the exception template does not exist
*/
public function showAction(Request $request, FlattenException $exception, DebugLoggerInterface $logger = null)
{
$currentContent = $this->getAndCleanOutputBuffering($request->headers->get('X-Php-Ob-Level', -1));
$code = $exception->getStatusCode();
return $this->render('MyappAdminBundle:Admin:error.html.twig',
array(
'status_code' => $code,
'status_text' => isset(Response::$statusTexts[$code]) ? Response::$statusTexts[$code] : '',
'exception' => $exception,
'logger' => $logger,
'currentContent' => $currentContent,
)
);
}
/**
* @param int $startObLevel
*
* @return string
*/
protected function getAndCleanOutputBuffering($startObLevel)
{
if (ob_get_level() <= $startObLevel) {
return '';
}
Response::closeOutputBuffers($startObLevel + 1, true);
return ob_get_clean();
}
}
我按照自己的喜好定义了错误模板。
我需要在config.yml
中添加以下行twig:
exception_controller: MyappAdminBundle:Exception:show
ps我确信我的代码可以改进,但它工作正常。
答案 2 :(得分:0)
最简单的方法是创建此文件:
/app/Resources/TwigBundle/views/Exception/error404.html.twig
/templates/bundles/TwigBundle/Exception/error404.html.twig
...并将此行复制到其中:
{{ render(controller('App\\Controller\\HomepageController::index')) }}
就是这样。这将显示带有404状态代码的主页。它仅在prod
环境下工作(清除缓存!),因为在dev
和test
中,Symfony始终显示其异常页面。
参考文献: