2013-03-18 12 views
14

Sto davvero lottando per capire questo e ora sto solo andando in tondo.Listener di eventi Symfony2 e accesso al kernel, richiesta e risposta?

Ho letto il più possibile il manuale, ho pagato un video tutorial, ho perlustrato Google e YouTube e non riesco a farlo funzionare.

Sto semplicemente cercando di impostare un listener che si attiva prima di ogni richiesta. Posso farlo, ma il mio problema è ottenere l'accesso alle varie altre parti di cui ho bisogno.

Di seguito è riportato un esempio, ma penso che solo il codice effettivo mi aiuterà a capire questo ora.

Sarei grato se qualcuno potesse compilare gli spazi vuoti. È solo un esempio, ma ogni parte mi spiegherà di cosa ho bisogno di sapere.

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' ] 

La classe:

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; 

    } 

} 

} 

risposta

39

Ci sono alcuni errori nel vostro services.yml
Al fine di rendere il vostro lavoro di codice, questo dovrebbe essere simile

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 } 

mio \ 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; 
     } 
    } 
} 
17

Sembra che in realtà non capisce Come Symfony2 funziona DIC. Il listener kernel.request può gestire solo i casi 1 e 2. Per il caso 3 è necessario utilizzare l'evento kernel.response.

services: 
    listener.requestresponse: 
    class: Acme\Bundle\NewBundle\EventListener\RequestListener 
    tags: 
     - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } 
     - { name: kernel.event_listener, event: kernel.response, method: onKernelResponse } 

La classe:

use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\HttpKernel\Event\FilterResponseEvent; 
use Symfony\Component\HttpFoundation\Response; 

class MyListener 
{ 
    public function onKernelRequest(GetResponseEvent $event) 
    { 
     $request = $event->getRequest(); 
     if ($request->query->get('option') == 2) { 
      $event->setResponse(new Response("hello, message here")); 
     } 
    } 

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

     if ($request->query->get('option') == 3) { 
      $response->headers->setCookie(new Cookie("test", 1)); 
     } 
    } 
} 
+1

una risposta eccellente. Grazie – user2143356

Problemi correlati