1

我正在将旧网站从 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 内部的文档,但我找不到可以帮助我入门的东西(即上面的一个小片段)。

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

一个片段来展示如何做到这一点将不胜感激。

4

1 回答 1

2

我没有使用过第一个 Symfony,但我猜你正在寻找事件监听器。特别是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);
    }
}

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

还有一个额外的标签选项priority是可选的,默认为0。这个值可以是-255到255,监听器会按照它们的优先级顺序执行。当您需要保证一个侦听器在另一个侦听器之前执行时,这很有用。

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

于 2012-08-10T16:39:09.870 回答