2012-05-29 84 views
5

所以,我试图找出这些听众,但我有关于他们发现在symfony的网站的任何信息问题..Symfony2的事件监听器

起初,我想创造会触发一个监听器每页加载...我认为,这可能是有害的整体系统性能,所以我然后想到它只触发:/和/ otherpage

但是,再次,我有问题找到任何信息在哪里开始与听众。任何帮助表示赞赏..所有听众都会这样做,正在使用Doctrine检查数据库并根据它找到的内容设置会话。

再次,任何帮助或建议表示赞赏。谢谢。

回答

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... 

    } 
} 

我不知道的将其设置为只对某些页面运行的最佳方式,但我最好的猜测是,检查路线,只打你的分贝它当路由匹配你设置的。

希望能让你开始!

Greg

+0

感谢您的信息格雷格!我会玩一玩,看看我能想出什么......我甚至可以通过检查每个页面加载情况而得到解决办法(所有查询都会检查数据库以查看是否存在是今天为用户输入或不是)..再次感谢! – Justin

+0

没问题。我不会过多担心它会在每次页面加载时调用监听器函数,它是一种非常小的服务,它不应该对性能产生任何影响,只是试着找出一种避免监听器每次碰到DB的方法除非它特别需要。让我知道你如何去,如果你有任何问题,很乐意尝试和帮助。 – greg

+0

我正在做同样的事情,但如果在侦听器查询中找不到任何内容,我想将所有内容短路并重定向到“即将推出”模板页面。关于如何在监听器中构建它的任何想法?谢谢! – Acyra