Dostęp do service container w listenerze.

Czasem aplikacja wymaga sprawdzanie pewnych danych np. co wywołanie.
W symfony 1.4 mogliśmy to osiągnąć za pomocą filtrów. W Symfony2 z pomocą przychodzi  rozbudowany system eventów + Doctrinowy Event Dispatcher.

Do kodu!

  • Pierwszym krokiem będzie zdefiniowanie service w configu.
services:
    kernel.listener.nazwaListenera:
        class: Acme\TwojBundlle\Listener\nazwaKlasy
        arguments: [@service_container]  #przekazujemy cały service container jako argument
        tags:
            - { name: kernel.event_listener, event: kernel.controller, method: onCoreController

Dlaczego wstrzykujemy cały service container? Wynika to z tego że odwołujemy się do innego zakresu niż ten gdzie znajduje się kernel.controller. Objawia sie to komunikatem: „Scope Widening Injection detected: The definition „kernel.listener.nazwaListenera” references the service „request” which belongs to a narrower scope.”

  • Teraz zostało nam już tylko napisać klasę Listenera
namespace Acme\TwojBundlle\Listener;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\HttpFoundation\Session;

class nazwaKlasy {
	public function __construct($serviceContainer) {
		$this->request = $serviceContainer->get('request');
		$this->em = $serviceContainer->get('doctrine')->getEntityManager();
	}

	public function onCoreController(Event $event) {
		if (HttpKernelInterface::MASTER_REQUEST === $event->getRequestType())
		{
			$session = $this->request->getSession();
		}
	}

Zostaw komentarz


Podpowiedź - możesz użyć tych HTML tagów i atrybutów:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>