Symfony2 event listener and getting access to Kernel, Request and Response?

symfony

Solution

There are few mistakes in your `services.yml` In order to make your code work, this should look like

services.yml

services:
  listener.requestresponse:
    class: My\AwesomeBundle\Listener\MyListener
    arguments: ['@service_container']
    tags:
      - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
      - { name: kernel.event_listener, event: kernel.response, method: onKernelResponse }

My\AwesomeBundle\Listener\MyListener.php

namespace My\AwesomeBundle\Listener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\DependencyInjection\ContainerInterface;

class MyListener
{
    protected $container;

    public function __construct(ContainerInterface $container) // this is @service_container
    {
        $this->container = $container;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        $kernel    = $event->getKernel();
        $request   = $event->getRequest();
        $container = $this->container;
    }

    public function onKernelResponse(FilterResponseEvent $event)
    {
        $response  = $event->getResponse();
        $request   = $event->getRequest();
        $kernel    = $event->getKernel();
        $container = $this->container;

        switch ($request->query->get('option')) {
            case 2:
                $response->setContent('Blah');
                break;

            case 3:
                $response->headers->setCookie(new Cookie('test', 1));
                break;
        }
    }
}

Problem

I'm really struggling to understand this and now I'm just going round in circles. I've read as much of the manual as possible, paid for a video tutorial, scoured Google and YouTube and just can't get this working. I am simply trying to set up a listener that activates before every request. I can do this, but my problem is getting access to the various other parts I need. Below is an example but I think only actual code will help me understand this now. I would appreciate if anyone could fill in the blanks. It's just an example, but each part will explain to me what it is I need to know. In config.yml: ``` services: kernel.listener.request_listener: class: Acme\Bundle\NewBundle\EventListener\RequestListener tags: - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } arguments: [ '@service_container' ] ``` The class: ``` namespace Acme\Bundle\NewBundle\EventListener; use Symfony\Component\HttpKernel\Event\GetResponseEvent; ***do I need to 'use' any others here?*** class RequestListener { public function onKernelRequest($container) { //reference to these: http://api.symfony.com/2.1/Symfony/Component/HttpKernel/Event/KernelEvent.html $kernel = //reference to the Request object $request = $kernel->getRequest(); //reference to the Response object $response = //options: // (1) continue to run usual content // (2) stop execution and output a message // (3) set cookie and continue to run usual content switch( $request->query->get('option') ) { case 1: return case 2: $this->setResponse("hello, message here"); break; case 3: // *** not sure if this is the way to do it *** $response->headers->setCookie(new Cookie("test", 1)); break; } } } ```

Original source