@Radarchik

Как сделать редирект в своем обработчике исключений?

/*
Когда захожу на страницу /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')) }}
  • Вопрос задан
  • 240 просмотров
Пригласить эксперта
Ответы на вопрос 1
voronkovich
@voronkovich
Полагаю, что Twig оборачивает возникающие исключения. Чтобы получить экземпляр исходного исключения, используйте метод getPrevious: php.net/manual/en/class.exception.php.

if (!$event->getException()->getPrevious() instanceof AlreadyLoginException) {
    return;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы