Symfony 3.4 event listener for routing

Multi tool use
Multi tool use











up vote
0
down vote

favorite












Im trying to display a flashbag on every page under certain conditions (loged in user, etc...), but im not sure how to use the right event listener, i think maybe I need some routing event listener for that...



Anyway, I tried with kernel.controller but in several pages there are more than 1 controller rendering content so I get duplicate flashbags in those pages. Thats why I think I need to use routes instead of controllers.



This is my code so far, I avoided conditions for now only to testing if its working (so it shows in any page always):



services.yml:



AppbundleEventListenerChapterFlashbagListener:
arguments: [ '@session','@doctrine.orm.entity_manager', '@security.token_storage', '@translator' ]
tags:
- { name: kernel.event_listener, event: kernel.controller, method: preExecute }


ChapterFlashbagListener:



<?php
namespace AppBundleEventListener;
use SymfonyComponentHttpFoundationSessionSession;
use DoctrineORMEntityManager;
use SymfonyComponentSecurityCoreAuthenticationTokenStorageTokenStorageInterface;
use SymfonyComponentHttpKernelEventFilterControllerEvent;
use SymfonyComponentTranslationTranslatorInterface;

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);
}
}


Additional info: The project is a backend with Sonata if that info helps










share|improve this question


























    up vote
    0
    down vote

    favorite












    Im trying to display a flashbag on every page under certain conditions (loged in user, etc...), but im not sure how to use the right event listener, i think maybe I need some routing event listener for that...



    Anyway, I tried with kernel.controller but in several pages there are more than 1 controller rendering content so I get duplicate flashbags in those pages. Thats why I think I need to use routes instead of controllers.



    This is my code so far, I avoided conditions for now only to testing if its working (so it shows in any page always):



    services.yml:



    AppbundleEventListenerChapterFlashbagListener:
    arguments: [ '@session','@doctrine.orm.entity_manager', '@security.token_storage', '@translator' ]
    tags:
    - { name: kernel.event_listener, event: kernel.controller, method: preExecute }


    ChapterFlashbagListener:



    <?php
    namespace AppBundleEventListener;
    use SymfonyComponentHttpFoundationSessionSession;
    use DoctrineORMEntityManager;
    use SymfonyComponentSecurityCoreAuthenticationTokenStorageTokenStorageInterface;
    use SymfonyComponentHttpKernelEventFilterControllerEvent;
    use SymfonyComponentTranslationTranslatorInterface;

    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);
    }
    }


    Additional info: The project is a backend with Sonata if that info helps










    share|improve this question
























      up vote
      0
      down vote

      favorite









      up vote
      0
      down vote

      favorite











      Im trying to display a flashbag on every page under certain conditions (loged in user, etc...), but im not sure how to use the right event listener, i think maybe I need some routing event listener for that...



      Anyway, I tried with kernel.controller but in several pages there are more than 1 controller rendering content so I get duplicate flashbags in those pages. Thats why I think I need to use routes instead of controllers.



      This is my code so far, I avoided conditions for now only to testing if its working (so it shows in any page always):



      services.yml:



      AppbundleEventListenerChapterFlashbagListener:
      arguments: [ '@session','@doctrine.orm.entity_manager', '@security.token_storage', '@translator' ]
      tags:
      - { name: kernel.event_listener, event: kernel.controller, method: preExecute }


      ChapterFlashbagListener:



      <?php
      namespace AppBundleEventListener;
      use SymfonyComponentHttpFoundationSessionSession;
      use DoctrineORMEntityManager;
      use SymfonyComponentSecurityCoreAuthenticationTokenStorageTokenStorageInterface;
      use SymfonyComponentHttpKernelEventFilterControllerEvent;
      use SymfonyComponentTranslationTranslatorInterface;

      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);
      }
      }


      Additional info: The project is a backend with Sonata if that info helps










      share|improve this question













      Im trying to display a flashbag on every page under certain conditions (loged in user, etc...), but im not sure how to use the right event listener, i think maybe I need some routing event listener for that...



      Anyway, I tried with kernel.controller but in several pages there are more than 1 controller rendering content so I get duplicate flashbags in those pages. Thats why I think I need to use routes instead of controllers.



      This is my code so far, I avoided conditions for now only to testing if its working (so it shows in any page always):



      services.yml:



      AppbundleEventListenerChapterFlashbagListener:
      arguments: [ '@session','@doctrine.orm.entity_manager', '@security.token_storage', '@translator' ]
      tags:
      - { name: kernel.event_listener, event: kernel.controller, method: preExecute }


      ChapterFlashbagListener:



      <?php
      namespace AppBundleEventListener;
      use SymfonyComponentHttpFoundationSessionSession;
      use DoctrineORMEntityManager;
      use SymfonyComponentSecurityCoreAuthenticationTokenStorageTokenStorageInterface;
      use SymfonyComponentHttpKernelEventFilterControllerEvent;
      use SymfonyComponentTranslationTranslatorInterface;

      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);
      }
      }


      Additional info: The project is a backend with Sonata if that info helps







      symfony routing listener symfony3.4






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 8 at 9:34









      LauraEld

      106




      106
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          1
          down vote



          accepted










          You need to check wether the request is the master request to avoid those dublicate messages.



          This can be done as follows:



           use SymfonyComponentHttpKernelHttpKernelInterface;

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

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





          share|improve this answer





















          • This works perfect! Thank you! One more thing for the record... I was on development environment so it seems the toolbar does another master request and still get 2 flashbags, I turned toolbar to false in config_dev.yml to get only one flashbag. In prod env should work fine. Found the answer to that issue on stackoverflow.com/questions/44606796/…
            – LauraEld
            Nov 8 at 11:29












          • You could also just use $event->isMasterRequest() .. does the same
            – Slatyoo
            Nov 8 at 15:56













          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














           

          draft saved


          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53204925%2fsymfony-3-4-event-listener-for-routing%23new-answer', 'question_page');
          }
          );

          Post as a guest
































          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          1
          down vote



          accepted










          You need to check wether the request is the master request to avoid those dublicate messages.



          This can be done as follows:



           use SymfonyComponentHttpKernelHttpKernelInterface;

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

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





          share|improve this answer





















          • This works perfect! Thank you! One more thing for the record... I was on development environment so it seems the toolbar does another master request and still get 2 flashbags, I turned toolbar to false in config_dev.yml to get only one flashbag. In prod env should work fine. Found the answer to that issue on stackoverflow.com/questions/44606796/…
            – LauraEld
            Nov 8 at 11:29












          • You could also just use $event->isMasterRequest() .. does the same
            – Slatyoo
            Nov 8 at 15:56

















          up vote
          1
          down vote



          accepted










          You need to check wether the request is the master request to avoid those dublicate messages.



          This can be done as follows:



           use SymfonyComponentHttpKernelHttpKernelInterface;

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

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





          share|improve this answer





















          • This works perfect! Thank you! One more thing for the record... I was on development environment so it seems the toolbar does another master request and still get 2 flashbags, I turned toolbar to false in config_dev.yml to get only one flashbag. In prod env should work fine. Found the answer to that issue on stackoverflow.com/questions/44606796/…
            – LauraEld
            Nov 8 at 11:29












          • You could also just use $event->isMasterRequest() .. does the same
            – Slatyoo
            Nov 8 at 15:56















          up vote
          1
          down vote



          accepted







          up vote
          1
          down vote



          accepted






          You need to check wether the request is the master request to avoid those dublicate messages.



          This can be done as follows:



           use SymfonyComponentHttpKernelHttpKernelInterface;

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

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





          share|improve this answer












          You need to check wether the request is the master request to avoid those dublicate messages.



          This can be done as follows:



           use SymfonyComponentHttpKernelHttpKernelInterface;

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

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






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 8 at 10:00









          nifr

          39.4k7104114




          39.4k7104114












          • This works perfect! Thank you! One more thing for the record... I was on development environment so it seems the toolbar does another master request and still get 2 flashbags, I turned toolbar to false in config_dev.yml to get only one flashbag. In prod env should work fine. Found the answer to that issue on stackoverflow.com/questions/44606796/…
            – LauraEld
            Nov 8 at 11:29












          • You could also just use $event->isMasterRequest() .. does the same
            – Slatyoo
            Nov 8 at 15:56




















          • This works perfect! Thank you! One more thing for the record... I was on development environment so it seems the toolbar does another master request and still get 2 flashbags, I turned toolbar to false in config_dev.yml to get only one flashbag. In prod env should work fine. Found the answer to that issue on stackoverflow.com/questions/44606796/…
            – LauraEld
            Nov 8 at 11:29












          • You could also just use $event->isMasterRequest() .. does the same
            – Slatyoo
            Nov 8 at 15:56


















          This works perfect! Thank you! One more thing for the record... I was on development environment so it seems the toolbar does another master request and still get 2 flashbags, I turned toolbar to false in config_dev.yml to get only one flashbag. In prod env should work fine. Found the answer to that issue on stackoverflow.com/questions/44606796/…
          – LauraEld
          Nov 8 at 11:29






          This works perfect! Thank you! One more thing for the record... I was on development environment so it seems the toolbar does another master request and still get 2 flashbags, I turned toolbar to false in config_dev.yml to get only one flashbag. In prod env should work fine. Found the answer to that issue on stackoverflow.com/questions/44606796/…
          – LauraEld
          Nov 8 at 11:29














          You could also just use $event->isMasterRequest() .. does the same
          – Slatyoo
          Nov 8 at 15:56






          You could also just use $event->isMasterRequest() .. does the same
          – Slatyoo
          Nov 8 at 15:56




















           

          draft saved


          draft discarded



















































           


          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53204925%2fsymfony-3-4-event-listener-for-routing%23new-answer', 'question_page');
          }
          );

          Post as a guest




















































































          MciPNBXZlx9B 88wrfBGHgL3pk,V,TcxhK0MCgJ XMmA9ZZJuCGkOqMaCmWKdid
          uVpexlxSabr8V1UL9b4oyoIupm2c

          Popular posts from this blog

          How to pass form data using jquery Ajax to insert data in database?

          Guess what letter conforming each word

          Run scheduled task as local user group (not BUILTIN)