2014-11-04 29 views
0

我正在尝试计算用户在登录期间访问了多少页。Symfony2 count访问过的网站每个用户

因此,我创建了一个Service,它正在监听Kernel::TERMINATE事件,每当用户转到我系统内的其他站点时应增加计数器。

class ActivityListener implements EventSubscriberInterface { 
    private $doctrine; 
    private $session; 

    public function __construct(Registry $doctrine, Session $session){ 
     $this->doctrine = $doctrine; 
     $this->session = $session; 
    } 

    public static function getSubscribedEvents(){ 
     return array(
      KernelEvents::TERMINATE => 'increasePageCount' 
     ); 
} 

    public function increasePageCount(){ 

     $em = $this->doctrine->getManager(); 

     $log = $em->getRepository('Bundle:UserLog')->findBy(array('sessionId' => $this->session->getId())); 

     if($log){ 
      $log = $log[0]; 
      $log->increasePageCounter(); //Function in the entity that increases the count 
      $em->persist($log); 
      $em->flush(); 
     } 
    } 
} 

该代码将被调用,这是好的,但每页换10次,这显然是很多方法!

我也尝试了Kernel::REQUEST事件,但结果相同。

我可以怎样才能让每个新页面请求只增加一次PageCounter? (例如,用户从账单概览开始到某个账单的细节)

回答

0

Kernel::VIEW在返回控制器动作响应时被触发。如果你想跟踪从一个视图到另一个视图的用户,这似乎是你最好的选择。

https://github.com/symfony/HttpKernel/blob/master/HttpKernel.php#L150

当然,如果你只是返回一些Ajax调用,或者你可能会做一个重定向一个JSON响应这也被解雇。所有的回应都被解雇了。不只是呈现。您可能可以通过请求来过滤它。

此外,我真的建议不要在Symfony内部进行用户跟踪。像Piwik这样的工具有一个很好的API,可以为用户创建良好的配置文件并进行跟踪。还有一个Piwik的Symfony Bundle,不知道它是否仍然维护,甚至可以工作