Подтвердить что ты не робот

Symfony 2 - настройка Flash-сообщения вне контроллера

У меня есть прослушиватель Logout, где я хотел бы установить флеш-сообщение с сообщением о выходе из системы.

namespace Acme\MyBundle\Security\Listeners;

use Symfony\Component\Security\Http\Logout\LogoutSuccessHandlerInterface;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;

class LogoutListener implements LogoutSuccessHandlerInterface
{
  private $security;  

  public function __construct(SecurityContext $security)
  {
    $this->security = $security;
  }

  public function onLogoutSuccess(Request $request)
  {
    $request->get('session')->getFlashBag()->add('notice', 'You have been successfully been logged out.');

    $response = new RedirectResponse('login');
    return $response;
  }
}

Вот мои services.yml(как это относится к этому):

logout_listener:
   class:  ACME\MyBundle\Security\Listeners\LogoutListener
   arguments: [@security.context]

Это вызывает ошибку:

Fatal error: Call to a member function getFlashBag() on a non-object

Как установить сообщение flashBag в этом контексте?

Также, как получить доступ к маршрутизатору, чтобы я мог генерировать URL-адрес (через $this- > router- > generate ('login')) вместо передачи в жестко запрограммированном URL-адресе?

Примечание по безопасности

Чтобы заставить flash работать, вы должны сообщить, что ваша версия security.yml не отменяет сеанс при выходе из системы; в противном случае сеанс будет уничтожен, и ваша вспышка никогда не появится.

logout:
    path: /logout
        success_handler: logout_listener
        invalidate_session: false
4b9b3361

Ответ 1

Вы должны вводить службы для сеанса и маршрутизатора в LogoutListener и использовать их для выполнения этих задач. Это способ сделать это в yml:

logout_listener: 
class: ACME\MyBundle\Security\Listeners\LogoutListener 
arguments: [@security.context, @router, @session]

Затем в вашем классе вы пишете:

class LogoutListener implements LogoutSuccessHandlerInterface
{
    private $security;
    private $router;
    private $session;

    public function __construct(SecurityContext $security, Router $router, Session $session)
    {
        $this->security = $security;
        $this->router = $router;
        $this->session = $session;
    }
    [...]

Если вы хотите использовать сеанс сейчас, вы можете просто сказать:

$this->session->getFlashBag()->add('notice', 'You have been successfully been logged out.');

И таким же образом вы можете использовать службу маршрутизатора для генерации маршрутов.

Ответ 2

Вы можете получить объект Session (а также любую другую услугу) через контейнер службы:

$session = $ServiceContainer->get('session');
$session->setFlash('notice', 'Message');

Способ доступа к контейнеру службы по-разному:

  • Из контроллера или любого класса, поддерживающего контейнер: просто используйте $this- > get ('session');
  • Из сервиса: вы должны ввести объект контейнера службы как Aldo Said