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
Ответы
Ответ 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