Symfony 3.4 event listener for routing











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




















































































          Popular posts from this blog

          Guess what letter conforming each word

          Port of Spain

          Run scheduled task as local user group (not BUILTIN)