Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony]2 Event Listener
Forum PHP.pl > Forum > PHP > Frameworki
lukas.skowronski
Witajcie,

mam problem z Symfony2. Chciałbym osiągnąć efekt podobny do
filtrów w Symfony1.

Założenie jest takie, aby przy wejściu na stronę niezależnie od
wywołanego kontrolera i akcji wywołać metodę sprawdzającą lub
ustawiającą dowolny parametr.

Starałem się to zrobić poprzez Event Listener i definicję
services w pliku config.yml

  1. services:
  2. kernel.listener.check:
  3. class: App\NameBundle\Listener\CheckListener
  4. tags:
  5. - { name: kernel.listener, event: onCoreController }


Oraz definicję klasy CheckListener
  1. namespace App\NameBundle\Listener;
  2.  
  3. use Symfony\Component\EventDispatcher\EventDispatcher;
  4. use Symfony\Component\EventDispatcher\Event;
  5.  
  6. class CheckListener
  7. {
  8. public function onCoreController(FilterControllerEvent $event)
  9. {
  10. die('test');
  11. }
  12. }


Niestety nie zaobserwowałem żadnego efektu działania i nie mogę
doszukać się żadnego przykładu w dokumentacji jak i internecie -
może ktoś już to rozgryzł?
destroyerr
Spróbuj tak:
Kod
services:
    kernel.listener.check:
        class: App\NameBundle\Listener\CheckListener
        tags:
            - { name: kernel.event_listener, event: kernel.controller, method: onCoreController }
lukas.skowronski
Ok, super - trochę mnie naprowadziłeś.

Ostatecznie wygląda to w sposób następujący:
  1. services:
  2. kernel.listener.check:
  3. class: App\NameBundle\Listener\CheckListener
  4. tags:
  5. - { name: kernel.event_listener, event: kernel.controller , method: onCoreController }


  1. namespace App\NameBundle\Listener;
  2.  
  3. use Symfony\Component\EventDispatcher\EventDispatcher;
  4. use Symfony\Component\EventDispatcher\Event;
  5.  
  6. class CheckListener
  7. {
  8.  
  9. public function onCoreController() {
  10.  
  11. die('test');
  12.  
  13. }
  14. }


Jeszcze raz dzięki! smile.gif

Ok, to może teraz ma ktoś pomysł jak dobrać się teraz do sesji w tym Listenerze?

Ewentualnie może ktoś ma inny pomysł na ten problem?
Crozin
Przekaż obiekt sesji do tego obiektu korzystając z DIC-a?
  1. <service id="kernel.listener.check" class="App\NameBundle\Listener\CheckListener">
  2. <argument type="service" id="session" /> <!-- czy tam request.session - nie pamiętam -->
  3.  
  4. <tag name="kernel.event_listener" event="kernel.controller" method="onCoreController" />
  5. </service>
  1. class CheckListener {
  2. private Session $session;
  3.  
  4. public function __construct(Session $session) {
  5. $this->session = $session;
  6. }
  7.  
  8. public function onCoreController() {
  9. die('test');
  10. }
  11. }
lukas.skowronski
Dzięki za odpowiedź.

W ramach rozszerzenia w wersji yml konfiguracja będzie wyglądać tak:

  1. services:
  2. kernel.listener.check:
  3. class: App\NameBundle\Listener\CheckListener
  4. arguments: [@session]
  5. tags:
  6. - { name: kernel.event_listener, event: kernel.request , method: onCoreController}


A w definicji CheckListener musimy jeszcze pamiętać o:

  1. use Symfony\Component\HttpFoundation\Session;
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.