/*
Когда захожу на страницу /login_form, то исключение Twig_Error_Runtime перебивает мое исключение AlreadyLoginException, как можно подавить Twig_Error_Runtime?
*/
EDIT: Как сделать редирект в своем обработчике исключений? исключение вызывается из контроллера который рендерится в твиг-шаблоне. В dev-среде редирект происходит, в prod-среде контроллер просто не рендерится в шаблоне.
Код только как пример:
Symfony 3.4
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use AppBundle\Exception\AlreadyLoginException;
class DefaultController extends Controller
{
/**
* @Route("/", name="homepage")
*/
public function indexAction(Request $request)
{
return $this->render('default/index.html.twig', [
'base_dir' => realpath($this->getParameter('kernel.project_dir')).DIRECTORY_SEPARATOR,
]);
}
/**
* @Route("/login", name="login")
*/
public function loginAction(Request $request)
{
if ($this->getUser()) {
throw new AlreadyLoginException('This user does not have access to this section.');
}
return $this->render('default/login.html.twig', []);
}
/**
* @Route("/login_form", name="login_form")
*/
public function loginFormAction(Request $request)
{
return $this->render('default/login_form.html.twig', []);
}
}
namespace AppBundle\EventListener;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;
use AppBundle\Exception\AlreadyLoginException;
use Symfony\Component\Routing\RouterInterface;
class AlreadyLoginExceptionListener
{
private $router;
public function __construct(RouterInterface $router)
{
$this->router = $router;
}
public function onKernelException(GetResponseForExceptionEvent $event)
{
if ((!$event->getException()->getPrevious() instanceof AlreadyLoginException)
&& (!$event->getException() instanceof AlreadyLoginException)) {
return;
} //@voronkovich thx
$response = new RedirectResponse($this->router->generate('homepage'));
$event->setResponse($response);
}
}
services:
kernel.listener.alreadyloginexception:
class: AppBundle\EventListener\AlreadyLoginExceptionListener
arguments:
- "@router"
tags:
- { name: kernel.event_listener, event: kernel.exception }
{# login_form.html.twig #}
{{ render(controller('AppBundle:Default:login')) }}