如何在Symfony2中转换此过滤器链类

时间:2012-08-10 16:33:58

标签: php symfony

我正在将旧网站从SF 1.x转换为S2。

旧代码中有一个类可以访问SF v1过滤器链。这是该课程的片段:

class myFilter extends sfFilter
{
    public function execute($filterChain)
    {
        // Execute this filter only once
        if ($this->isFirstCall())
        {
            // Filters don't have direct access to the request and user objects.
            // You will need to use the context object to get them
            $context = $this->getContext();
            $user = $context->getUser();

            if ($user->isAuthenticated())
            {                
                // Do something
            }
        }

        // Execute next filter
        $filterChain->execute();
    }

}

我希望能够实现此功能,即窥探请求,并根据用户会话采取行动。似乎SF已经废除了过滤器链,我已经查看了Symfony内部的文档,但是我找不到一些东西(比如上面的一个小片段),这可以帮助我开始。< / p>

有没有人知道如何监听请求(可以通过v1中的过滤器链完成),但是使用SF2中提供的新机制?

显示如何执行此操作的代码段将不胜感激。

1 个答案:

答案 0 :(得分:2)

我没有和第一个Symfony合作,但我想你正在寻找event listeners。特别是onKernelRequest一个。您所要做的就是创建Listener类,将其注册为服务并注入您需要的任何内容,这样您就可以了。

例如:

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;

class RequestListener
{
    public function onKernelRequest(GetResponseEvent $event)
    {
        $response = new RedirectResponse('http://www.google.com');
        $event->setResponse($response);
    }
}

此监听器会将所有人重定向到Google。例如,如果您需要发送邮件,您可以将SwiftMailer注入此侦听器的服务,并在您正常使用它时使用它。 Symfony2中的监听器也有优先级,您可以通过它来调整执行顺序:

  

还有一个额外的标签选项优先级是可选的   默认为0.此值可以是-255到255,以及侦听器   将按优先顺序执行。这很有用   你需要保证一个监听器在另一个监听器之前被执行。

还有一个解决方案,但它不如使用侦听器那么优雅。您可以创建基本控制器并将所有逻辑放入其构造函数中。所有其他控制器都必须扩展此控制器(如果您想在所有页面上执行某些操作)。