Symfony2,有没有像SpringMVC拦截器一样的工作方式?

时间:2013-01-14 20:36:19

标签: symfony

目前我正在使用Symfony2,这是一个非常棒的框架。

我使用SpringMVC并且它具有“拦截器”的概念,它可以捕获对任何“控制器”的请求,并且允许例如检查用户是否已经记录。

是否有任何注释方法可以用Symfony2做类似的事情。

提前致谢。

1 个答案:

答案 0 :(得分:2)

您可以附加事件侦听器以响应框架事件。看看:

http://symfony.com/doc/current/cookbook/service_container/event_listener.html

您可以订阅许多活动,所有活动均可在文档中找到:

http://api.symfony.com/2.1/Symfony/Component/HttpKernel/KernelEvents.html

可能您正在寻找REQUEST事件,它应该类似于:

<?php

namespace Acme\DemoBundle\Listener;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;

class Listener
{
    /**
     * @var \Symfony\Component\DependencyInjection\ContainerInterface
     */
    private $router;
    private $service_container;

    public function __construct(\Symfony\Component\Routing\Router $router, $service_container) {
        $this->router = $router;
        $this->service_container = $service_container;
    }

    public function onKernelRequest(GetResponseEvent $event) {
         // DO STUFF
    }
}

在services.xml上:

<service id="max4.sms.listener"  class="Acme\DemoBundle\Listener\Logger">
        <tag name="kernel.event_listener" event="kernel.request" method="onKernelRequest" />
        <argument type="service" id="router" />
        <argument type="service" id="service_container" />
</service>

使用

定义您正在收听的事件
<tag name="kernel.event_listener" event="kernel.request" method="onKernelRequest" />

注入 __ construct()方法的参数(参见http://symfony.com/doc/current/components/dependency_injection/introduction.html):

<argument type="service" id="router" />
<argument type="service" id="service_container" />