2013-03-18 38 views
14

私は本当にこれを理解するのに苦労しています。今ではサークルを回っています。Symfony2のイベントリスナーとカーネル、リクエスト、レスポンスにアクセスできますか?

私はできるだけ多くのマニュアルを読んだことがあり、ビデオチュートリアル、GoogleとYouTubeを磨き、これを手に入れることはできません。

すべてのリクエストの前にアクティブにするリスナーを設定しようとしています。私はこれを行うことができますが、私の問題は必要な他のさまざまな部分にアクセスできるようになっています。

以下は例ですが、実際のコードのみがこれを理解するのに役立つと思います。

誰でも空白を記入していただければ幸いです。それは単なる例ですが、各部分は私にそれを知る必要があることを私に説明します。 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' ] 

クラス:あなたのコードを動作させるためには、あなたのservices.yml
にはいくつかのミスがあり

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; 

    } 

} 

} 

答えて

39

、これは

のようになります。

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 } 

マイ\ AwesomeBundle \リスナー\ 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

あなたが実際にどのようにSymfony2のDIC作品を理解していないようです。 kernel.requestリスナーはケース1と2のみを処理できます。ケース3の場合は、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 } 

クラス:

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

優れた答え。ありがとう – user2143356

関連する問題