Redirect with Event Listener for all "No route found 404 Not Found - NotFoundHttpException" Redirect with Event Listener for all "No route found 404 Not Found - NotFoundHttpException" symfony symfony

Redirect with Event Listener for all "No route found 404 Not Found - NotFoundHttpException"


You have 2 options:

  • Use an Event Listener
  • Use a route that matches all the routes that don't exist and trigger an action in a controller.

Let me know if that works.


Option 1

Note: Have a look at Symfony2 redirect for event listener

1 Pass the router to your event listener:

kernel.listener.kernel_request:       class: Booking\AdminBundle\EventListener\ErrorRedirect       arguments:           router: "@router"       tags:           - { name: kernel.event_listener, event: kernel.exception, method: onKernelException }

2 Use the router within the listener to redirect users:

namespace Booking\AdminBundle\EventListener;use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;use Symfony\Component\HttpFoundation\RedirectResponse;use Symfony\Bundle\FrameworkBundle\Routing\Router;class ErrorRedirect{    /**     * Holds Symfony2 router     *     *@var Router     */    protected $router;    /**     * @param Router     */    public function __construct(Router $router)    {        $this->router = $router;    }    public function onKernelException(GetResponseForExceptionEvent $event)    {        $exception = $event->getException();        if ($exception instanceof NotFoundHttpException) {            /** Choose your router here */            $route = 'route_name';            if ($route === $event->getRequest()->get('_route')) {                return;            }            $url = $this->router->generate($route);            $response = new RedirectResponse($url);            $event->setResponse($response);        }    }} 

Option 2

You can create a special route that will match all routes that don't exist; You can then handle the redirect the way you want within the controller of your choice, here PageNotFoundController:

1 At the end of app/config/routing.yml

pageNotFound:    pattern:  /{path}    defaults: { _controller: AcmeDemoBundle:PageNotFound:pageNotFound, path: '' }    requirements:        path: .*

2

<?phpnamespace Acme\DemoBundle\Controller;use Symfony\Bundle\FrameworkBundle\Controller\Controller;use Symfony\Component\HttpFoundation\JsonResponse;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;class PageNotFoundController extends Controller{    public function pageNotFoundAction()    {        // redirect the way you want    }}