我正在将旧网站从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中提供的新机制?
显示如何执行此操作的代码段将不胜感激。
答案 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,以及侦听器 将按优先顺序执行。这很有用 你需要保证一个监听器在另一个监听器之前被执行。
还有一个解决方案,但它不如使用侦听器那么优雅。您可以创建基本控制器并将所有逻辑放入其构造函数中。所有其他控制器都必须扩展此控制器(如果您想在所有页面上执行某些操作)。