I am building an administration panel for a website and I would like to change the view called when a 404 exception occurs but only for the admin application. (path: /admin/*)
I have already overdid the error404.html.twig view (at app/Resources/TwigBundle/views/Exception/) for the website.
I thought of the kernel.exception event listener but now I am stuck with two things:
-
Loading another error view only when the route starts with the prefix:
/admin/$route = $event->getRequest->get('_route')->render() //returns NULL -
Calling the
$event->container->get('templating')->render()function.
I end up with an infinite loop (blank page) as the script fails.
The only things I’ve got working are:
-
Retrieving the exception code:
$exception = $event->getException(); $code = $exception->getCode(); -
Creating a new response:
$response = new Response(); $event->setResponse($response);
Any suggestions on how to achieve this?
[EDIT]
The class:
namespace Cmt\AdminBundle\EventListener;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Bundle\TwigBundle\TwigEngine;
class AdminActionListener
{
/**
* @var ContainerInterface
*/
protected $container;
/**
* @var TwigEngine
*/
protected $templating;
/**
* @param ContainerInterface $container
*/
public function __construct(ContainerInterface $container, TwigEngine $templating){
// assign value(s)
$this->container = $container;
$this->templating = $templating;
}
/**
*
* @param GetResponseForExceptionEvent $event
*/
public function onKernelException(GetResponseForExceptionEvent $event)
{
// get exception
$exception = $event->getException();
// get path
$path = $event->getRequest()->getPathInfo();
/*
* Redirect response to new 404 error view only
* on path prefix /admin/
*/
}
}
And the services.yml:
services:
cmt_admin.exception.action_listener:
class: Cmt\AdminBundle\EventListener\AdminActionListener
arguments: [@service_container] [@templating]
tags:
- { name: kernel.event_listener, event: kernel.exception, method: onKernelException }
For some reason, this worked:
Which is basically what I was doing earlier with a different syntax…
@dmirkitanov Anyway, thanks for your help !