5

所以,我试图找出这些听众,但我在 symfony 网站上查找有关他们的任何信息时遇到问题。

最初,我想创建一个在每次页面加载时触发的侦听器......我认为这可能对整体系统性能有害,所以我想让它只在:/和/otherpage上触发

但同样,我在查找有关从何处开始使用侦听器的任何信息时遇到问题。任何帮助表示赞赏..所有这个监听器将做的,是使用 Doctrine 检查数据库并根据它找到的内容设置会话..

再次感谢任何帮助或建议。谢谢。

4

1 回答 1

10

我做了类似的事情来检查子域没有改变。您可以将侦听器作为服务放入配置文件中,如下所示:

services:
    page_load_listener:
        class: Acme\SecurityBundle\Controller\PageLoadListener
        arguments: 
            security: "@security.context", 
            container: "@service_container"
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 64 }

我不确定优先级是如何工作的,但我发现如果它设置得太高,它就不会在应用程序的其余部分之前运行。在我的待办事项清单上进行更多研究。

这是监听器外观的示例。

namespace Acme\SecurityBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;

class PageLoadListener extends controller
{
    private $securityContext;
    protected $container;
    protected $query;

    public function __construct(SecurityContext $context, $container, array $query = array())
    {
        $this->securityContext = $context;
        $this->container = $container;
        $this->query = $query;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {       
        //if you are passing through any data
        $request = $event->getRequest();

        //if you need to update the session data
        $session = $request->getSession();              

        //Whatever else you need to do...

    }
}

我不确定将其设置为仅在某些页面上运行的最佳方法,但我最好的猜测是检查路由并仅在路由与您设置的任何内容匹配时才访问您的数据库。

希望这能让你开始!

格雷格

于 2012-05-29T22:33:07.920 回答