Symfony2计数访问了每个用户的站点

时间:2014-11-04 10:44:37

标签: php symfony

我正在尝试计算用户在登录期间访问过的页数。

所以我创建了一个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? (例如,用户从“结算概览”转到某个特定账单的详细信息)

1 个答案:

答案 0 :(得分:0)

返回控制器操作响应时会触发

Kernel::VIEW。如果您只是想跟踪用户从一个视图到另一个视图,那么这似乎是您最好的选择。

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

当然,如果您只是在某个ajax调用或您可能执行的重定向中返回JSON响应,也会触发此操作。所以所有回复都被解雇了。不只是渲染。您可以通过请求过滤它。

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