Jeżeli jesteś osobą programującą wcześniej w Symfony w wersji 1.* na pewno miałeś okazję korzystać z filtrów które są niesamowicie przydatnym mechanizmem. Szukając tego mechanizmu w Symfony2 niestety w pierwszej chwili możemy się rozczarować – ponieważ nie istnieje w nim rozwiązanie 1:1 takie samo.
Ale jak to zwykle bywa, nie ma tego złego co by na dobre nie wyszło. Zamiast filtrów możemy skorzystać z Event Listenerów i Serwisów.
Postawmy sobie założenie: “chcemy przed wyświetleniem treści w każdym kontrolerze/akcji wyświetlić dodatkowy tekst”
Rozpoczynamy od stworzenia klasy Listener’a .
W naszym przypadku będzie to plik w lokalizacji App\NameBundle\Listener\ o nazwie CheckListener.php
namespace App\NameBundle\Listener;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\Event;
class CheckListener
{
public function onCoreController() {
echo 'added in App\NameBundle\Listener\CheckListener\Controller'.'
';
}
public function onCoreRequest() {
echo 'added in App\NameBundle\Listener\CheckListener\Request'.'
';
}
}
W klasie mamy zdefiniowane dwie metody które wykorzystamy przy zgłaszaniu eventu przez controller oraz request.
Przyszedł czas na podłączenie naszego Listenera do Symfony2. Do tego wykorzystujemy kod w pliku config.yml :
services:
kernel.listener.check_controller:
class: App\NameBundle\Listener\CheckListener
tags:
- { name: kernel.event_listener, event: kernel.controller , method: onCoreController }
kernel.listener.check_request:
class: App\NameBundle\Listener\CheckListener
tags:
- { name: kernel.event_listener, event: kernel.request , method: onCoreRequest }
Dzięki tej konfiguracji wszystko powinno już działać. Kolejny plusem jest iż po wywołaniu strony przekonamy się który z mechanizmów zostanie wykonany jako pierwszy.
Możemy uchylić rąbka tajemnicy i jednoznacznie stwierdzamy iż jako pierwszy zostanie uruchomiony kernel.request a dopiero kolejno kernel.controller.