显示特定路线而不是错误页面(404) - Symfony2

时间:2013-04-13 01:05:22

标签: symfony

我想要显示/ sitemap页面,而不是错误页面/ 404。当然我不想重定向,我仍然希望设置404 HTTP响应头。​​

这可能吗?我只能看到如何在Twig中设置模板。

我绝对不想要重定向。

3 个答案:

答案 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)

最简单的方法是创建此文件:

  • Symfony 3:/app/Resources/TwigBundle/views/Exception/error404.html.twig
  • Symfony 4:/templates/bundles/TwigBundle/Exception/error404.html.twig

...并将此行复制到其中:

{{ render(controller('App\\Controller\\HomepageController::index')) }}

就是这样。这将显示带有404状态代码的主页。它仅在prod环境下工作(清除缓存!),因为在devtest中,Symfony始终显示其异常页面。

参考文献: