用于路由的Symfony 3.4事件侦听器

用于路由的Symfony 3.4事件侦听器,symfony,routing,listener,symfony-3.4,Symfony,Routing,Listener,Symfony 3.4,我试图在特定条件下(登录用户等)在每个页面上显示一个flashbag,但我不确定如何使用正确的事件侦听器,我想也许我需要一些路由事件侦听器 无论如何,我试过使用kernel.controller,但是在几个页面中有不止一个控制器呈现内容,所以我在这些页面中得到了重复的flashbag。这就是为什么我认为我需要使用路由而不是控制器 这是到目前为止我的代码,我现在避免了条件,只是为了测试它是否工作(因此它总是显示在任何页面中): 服务。yml: Appbundle\EventListener\Cha

我试图在特定条件下(登录用户等)在每个页面上显示一个flashbag,但我不确定如何使用正确的事件侦听器,我想也许我需要一些路由事件侦听器

无论如何,我试过使用kernel.controller,但是在几个页面中有不止一个控制器呈现内容,所以我在这些页面中得到了重复的flashbag。这就是为什么我认为我需要使用路由而不是控制器

这是到目前为止我的代码,我现在避免了条件,只是为了测试它是否工作(因此它总是显示在任何页面中):

服务。yml:

Appbundle\EventListener\ChapterFlashbagListener:
  arguments: [ '@session','@doctrine.orm.entity_manager', '@security.token_storage', '@translator' ]
  tags:
    - { name: kernel.event_listener, event:  kernel.controller, method: preExecute }
<?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);
  }
}
章节FlashBagListener:

Appbundle\EventListener\ChapterFlashbagListener:
  arguments: [ '@session','@doctrine.orm.entity_manager', '@security.token_storage', '@translator' ]
  tags:
    - { name: kernel.event_listener, event:  kernel.controller, method: preExecute }
<?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);
  }
}

您需要检查请求是否为主请求,以避免那些重复的消息

这可以通过以下方式完成:

 use Symfony\Component\HttpKernel\HttpKernelInterface;

 if ($event->getRequestType() !== HttpKernelInterface::MASTER_REQUEST) {
     return;
 }

 $this->session->getFlashBag()->add('warning', $warning);

这工作完美!非常感谢。还有一件事要记录在案。。。我在开发环境中,所以工具栏似乎执行了另一个主请求,但仍然得到了2个flashbag,我在config_dev.yml中将工具栏设置为false,以只得到一个flashbag。在prod环境中应该可以正常工作。在上找到了该问题的答案,您也可以使用
$event->isMasterRequest()
。。同样如此