Personalizar error 404 Symfony 3

En este tutorial hablaremos de los errores 404 el famoso “Not Found” de symfony. Por defecto symfony escucha las excepciones del kernel. Cuando detecta una excepción, este transforma la petición de respuesta como una respuesta 404. El problema viene cuando tenemos un Backend y un Frontend. Symfony no sabe que tipo de mensaje 404 debe mostrar al usuario, por eso tenemos que tocar un poco el escuchador de eventos para detectar las excepciones y tratarlas.. Por suerte aquí tengo un ejemplo que explica como funcionan los escuchadores de eventos y tratamos las excepciones del kernel.

Antes de empezar tenemos que saber que son los eventos y es que a lo largo de la ejecución de nuestra aplicación Symfony registra todos los pasos por los que trascurre la aplicación. Sabiendo esto podemos cambiar el comportamiento del kernel añadiendo fragmentos de código. Se puede detectar (Login Success, Login Fail, After Register, Send Mail)

En nuestro caso detectamos las excepciones globales de la aplicación y rederizamos una plantilla en el caso que la url sea del Backend o el Frontend.

<?php
namespace AppBundle\EventListener;

use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Bundle\FrameworkBundle\Routing\Router;
use Symfony\Component\HttpFoundation\Response;

use Psr\Log\LoggerInterface;    //Log
use Twig_Environment;           //Gestor de la plantilla


class ExceptionListener{

    /**
     *  @var Router
     */
    protected $router;

    /**
     *  @var LoggerInterface
     */
    protected $logger;

    /**
     * @var EngineInterface
     */
    protected $templating;

    public function __construct(Router $router, LoggerInterface $logger, Twig_Environment $twig){
        $this->router = $router;
        $this->logger = $logger;
        $this->templating = $twig;
    }

    public function onKernelException(GetResponseForExceptionEvent $event){

        $request = $event->getRequest();
        $exception = $event->getException();

        if($exception instanceof NotFoundHttpException){

            // Comprueba si empieza con /admin
            if(substr($request->getPathInfo(), 0, strlen('/admin')) === '/admin') {
                // Cargo la plantilla 404 del Admin
                $response = new Response($this->container->get('templating')->render('@Burger/ADMIN/Exception/error404.html.twig', array(
                        'exception' => $exception
                )));
                $this->logger->info('Pagina no encontrada: '.$request->getPathInfo());
                $response->setContent('Error 404 del admin');
            }else{
                $response = new Response($this->templating->render('@Burger/CLIENT/Exception/error404.html.twig', array(
                        'exception' => $exception
                )));
                $this->logger->info('Pagina no encontrada: '.$request->getPathInfo());
                $response->setStatusCode($exception->getStatusCode());
                $response->setContent('Error 404');
            }

            // sends the modified response object to the event
            $event->setResponse($response);
        }
    }
}

?>