在Symfony3中的每个路径/操作上执行功能

时间:2016-01-27 15:43:47

标签: symfony

我有一个跟踪页面加载的日志记录功能。我想将它添加到Symfony中已有的每条路径中。

目前我这样做:

/**
 * @Route("/test", name="test")
 */
public function testAction(Request $request)
{


    /* Function to register pageload */
    $this->get('statsd')->countMetric('visitor.'.$request->get('_route'));


    return $this->render('default/indexFull.html.twig', array());

}

我当然可以在每条路线上添加该行,但由于我是Symfony的新手,我认为可能有更优雅的方法?

任何暗示都赞赏!

1 个答案:

答案 0 :(得分:3)

Symfony在处理请求期间触发事件。其中一个事件是kernel.request事件,它在每个控制器之前执行。

请注意,路由器也会在此事件期间进行匹配,因此您需要确保在路由器侦听器之后执行侦听器。这可以通过使用优先级来完成。

use Symfony\Component\HttpKernel\Event\GetResponseEvent;

class CountMetricLogger
{
    // ...

    public function logVisit(GetResponseEvent $event)
    {
        $this->statsd->countMetric('visitor.'.$event->getRequest()->get('_route'));
    }
}
# app/config/services.yml
app.metric_logger:
    class: AppBundle\EventListener\CountMetricLogger
    arguments: ['@statsd']
    tags:
        - { name: kernel.event_listener, event: kernel.request, method: logVisit }

更多信息: