Symfony2 - мигающие сообщения при перенаправлении на страницу входа

У меня есть автоматическое перенаправление на странице входа при доступе к маршруту /user/*. Мне нужно отображать флэш-сообщения при перенаправлении на страницу входа.

Я читал что-то о прослушивателях событий, но мне нужен реальный пример, чтобы реализовать это.

Я пытался:

services:
    listener.requestresponse:
        class: SciForum\Version2Bundle\EventListener\ExceptionListener
        tags:
          - { name: kernel.event_listener, event: kernel.exception, method: onKernelException }

И мой ExceptionListener

class ExceptionListener
{
public function onKernelException(GetResponseForExceptionEvent $event)
{
    // You get the exception object from the received event
    $exception = $event->getException();
    $message = sprintf(
            'My Error says: %s with code: %s',
            $exception->getMessage(),
            $exception->getCode()
    );

    // Customize your response object to display the exception details
    $response = new Response();
    $response->setContent($message);

    // HttpExceptionInterface is a special type of exception that
    // holds status code and header details
    if ($exception instanceof HttpExceptionInterface) {
        $response->setStatusCode($exception->getStatusCode());
        $response->headers->replace($exception->getHeaders());
    } else {
        $response->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR);
    }

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

Но исключение составляет более новый бросок, когда есть автоматическое перенаправление.


person Milos Cuculovic    schedule 16.06.2014    source источник
comment
Перенаправление не вызовет исключение, поэтому я думаю, что ваш код не работает.   -  person BobFlemming    schedule 16.06.2014
comment
Я бы посмотрел на передачу: api.symfony.com/2.5/ Symfony/Component/HttpKernel/Event/ вместо GetResponseForExceptionEvent   -  person BobFlemming    schedule 16.06.2014
comment
@BobFlemming, не могли бы вы объяснить немного подробнее свой комментарий. Ответ с примером будет идеальным. Спасибо.   -  person Miloš    schedule 17.06.2014


Ответы (1)


EventListener предназначен для прослушивания определенных событий. Вы создали ExceptionListener, который принимает GetResponseForExceptionEvent в качестве аргумента. Если перенаправление прошло успешно, оно никогда не вызовет никаких исключений.

Вам нужно создать общий EventListener или даже InteractiveLoginEvent прослушиватель. :

Вот прослушиватель входа в систему, который я сделал:

    use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
    use Symfony\Component\Security\Core\SecurityContext;
    use Doctrine\Bundle\DoctrineBundle\Registry as Doctrine; 

class LoginListener
{

    private $securityContext;       

    private $em;        

    public function __construct(SecurityContext $securityContext, Doctrine $doctrine)
    {
        $this->securityContext = $securityContext;
        $this->em              = $doctrine->getManager();
    }

    public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
    {
             //do stuff
    }
}

Но, чтобы решить вашу проблему напрямую, не могли бы вы просто получить заголовки перенаправления в контроллере, а затем отобразить сообщение?

person BobFlemming    schedule 17.06.2014