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' ]
Класс:
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;
}
}
}
Ответы
Ответ 1
В вашем services.yml
есть несколько ошибок.
Чтобы заставить ваш код работать, это должно выглядеть как
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;
}
}
}
Ответ 2
Кажется, что вы действительно не понимаете, как работает 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));
}
}
}