用于路由的 Symfony 3.4 事件监听器
Symfony 3.4 event listener for routing
我试图在特定条件下(登录用户等...)在每个页面上显示一个 flashbag,但我不确定如何使用正确的事件监听器,我想也许我需要一些路由事件监听器那...
无论如何,我尝试使用 kernel.controller,但在几个页面中有超过 1 个控制器呈现内容,所以 我在这些页面中得到了重复的 flashbags。这就是为什么我认为我需要使用路由而不是控制器。
到目前为止,这是我的代码,我暂时避免了条件,只是为了测试它是否有效(因此它始终显示在任何页面中):
services.yml:
Appbundle\EventListener\ChapterFlashbagListener:
arguments: [ '@session','@doctrine.orm.entity_manager', '@security.token_storage', '@translator' ]
tags:
- { name: kernel.event_listener, event: kernel.controller, method: preExecute }
ChapterFlashbagListener:
<?php
namespace AppBundle\EventListener;
use Symfony\Component\HttpFoundation\Session\Session;
use Doctrine\ORM\EntityManager;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\Translation\TranslatorInterface;
class ChapterFlashbagListener
{
private $session;
private $em;
private $tokenStorage;
protected $translator;
public function __construct(Session $session, EntityManager $em, TokenStorageInterface $tokenStorage, TranslatorInterface $translator)
{
$this->session = $session;
$this->em = $em;
$this->tokenStorage = $tokenStorage;
$this->translator = $translator;
}
/**
* @param FilterControllerEvent $event
*/
public function preExecute(FilterControllerEvent $event)
{
$request = $event->getRequest();
$session = $request->getSession();
$m = $this->translator->trans('message');
$session->getFlashBag()->add('warning', $m);
}
}
其他信息:如果该信息有帮助,该项目是 Sonata 的后端
您需要检查请求是否是主请求以避免那些重复的消息。
这可以按如下方式完成:
use Symfony\Component\HttpKernel\HttpKernelInterface;
if ($event->getRequestType() !== HttpKernelInterface::MASTER_REQUEST) {
return;
}
$this->session->getFlashBag()->add('warning', $warning);
我试图在特定条件下(登录用户等...)在每个页面上显示一个 flashbag,但我不确定如何使用正确的事件监听器,我想也许我需要一些路由事件监听器那...
无论如何,我尝试使用 kernel.controller,但在几个页面中有超过 1 个控制器呈现内容,所以 我在这些页面中得到了重复的 flashbags。这就是为什么我认为我需要使用路由而不是控制器。
到目前为止,这是我的代码,我暂时避免了条件,只是为了测试它是否有效(因此它始终显示在任何页面中):
services.yml:
Appbundle\EventListener\ChapterFlashbagListener:
arguments: [ '@session','@doctrine.orm.entity_manager', '@security.token_storage', '@translator' ]
tags:
- { name: kernel.event_listener, event: kernel.controller, method: preExecute }
ChapterFlashbagListener:
<?php
namespace AppBundle\EventListener;
use Symfony\Component\HttpFoundation\Session\Session;
use Doctrine\ORM\EntityManager;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\Translation\TranslatorInterface;
class ChapterFlashbagListener
{
private $session;
private $em;
private $tokenStorage;
protected $translator;
public function __construct(Session $session, EntityManager $em, TokenStorageInterface $tokenStorage, TranslatorInterface $translator)
{
$this->session = $session;
$this->em = $em;
$this->tokenStorage = $tokenStorage;
$this->translator = $translator;
}
/**
* @param FilterControllerEvent $event
*/
public function preExecute(FilterControllerEvent $event)
{
$request = $event->getRequest();
$session = $request->getSession();
$m = $this->translator->trans('message');
$session->getFlashBag()->add('warning', $m);
}
}
其他信息:如果该信息有帮助,该项目是 Sonata 的后端
您需要检查请求是否是主请求以避免那些重复的消息。
这可以按如下方式完成:
use Symfony\Component\HttpKernel\HttpKernelInterface;
if ($event->getRequestType() !== HttpKernelInterface::MASTER_REQUEST) {
return;
}
$this->session->getFlashBag()->add('warning', $warning);