Show a specific route instead of error page (404) - Symfony2

symfony

Solution

As shown in the Symfony Cookbook you can override error pages in two ways:

- Overriding the templates

- Using a custom exception controller

If you only want to show the `/sitemap` route on a 404 (`HttpNotFoundException`) exception you could override the Twig exception template by creating a new template in `app/Resources/TwigBundle/views/Exception/error404.html.twig`.

Another way that is not shown in the cookbook is using an event listener. When the kernel encounters an exception, a `kernel.exception` event is dispatched. By default, this exception is caught by the exception listening provided by Twig. You can create your own event listener which listens for the `kernel.exception` event and renders a page:

<?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)
    }
}

(I haven't tested this code, so you should try it yourself! And you have to inject the templating service into the event listener yourself, of course).

Problem

Instead of an error page / 404 I want to just show the /sitemap page. Of course I don't want a redirect and I still want the 404 HTTP response header to be set. Is this possible? All I can see is how to set templates in Twig. I definitely don't want a redirect.

Original source