Symfony2内核事件订阅器自动记录路由访问地址

冬芳君_7463

冬芳君_7463

2026-08-15

749人浏览

原创

kernel.request 事件监听器必须注册为带 kernel.event_subscriber 标签的服务,实现 eventsubscriberinterface 并在 getsubscribedevents() 中声明事件;优先级需合理设置以确保路由信息可用,且应过滤非业务请求并记录完整 uri。

symfony2内核事件订阅器自动记录路由访问地址

kernel.request 事件监听器必须注册为服务并标记为 event_subscriber

直接在控制器里写逻辑无法响应全局请求,必须通过事件订阅器(EventSubscriber)机制介入内核流程。关键不是“写了类”,而是这个类是否被 Symfony 的容器识别为事件订阅器——它需要在 services.yml 中显式声明,并添加 tags: [{ name: 'kernel.event_subscriber' }]

常见错误是只定义了服务但漏掉 tag,结果订阅器完全不触发;或者用了 kernel.event_listener 标签却没实现 getSubscribedEvents() 方法,导致报错 The "kernel.request" event listener ... does not exist

  • 订阅器类必须实现 EventSubscriberInterface
  • getSubscribedEvents() 必须返回数组,键为事件名(如 'kernel.request'),值为回调方法名或 [方法名, 优先级]
  • 优先级默认为 0;负数优先级更早执行(比如你想在 RouterListener 之前拦截请求)

从 Request 对象中安全提取路由信息

路由信息只有在 RouterListener 执行后才写入 $request->attributes,所以监听 kernel.request 时不能假设 _route_controller 一定存在。如果你的订阅器优先级高于 RouterListener(比如设为 10),$request->attributes->get('_route') 就会返回 null,导致后续日志写入空值或抛出异常。

正确做法是:要么把优先级设为 -10(确保在路由解析之后),要么加判空:

public function onKernelRequest(GetResponseEvent $event)
{
    $request = $event->getRequest();
    $routeName = $request->attributes->get('_route', 'unknown');
    $controller = $request->attributes->get('_controller', 'none');

    // 记录到 monolog 或自定义 logger
    $this->logger->info('Route accessed', [
        'route' => $routeName,
        'controller' => $controller,
        'uri' => $request->getRequestUri(),
        'method' => $request->getMethod(),
    ]);
}

避免日志爆炸:过滤 CLI、健康检查和静态资源请求

默认情况下,kernel.request 会捕获所有 HTTP 请求,包括 app/console 命令触发的 HTTP 内部调用、/healthz 探针、/bundles/ 资源路径等。这些请求进日志既无业务价值,又快速撑爆磁盘。

Symfony Linux版
Symfony Linux版

Symfony Linux版整理 Symfony CLI 5.17.1 官方下载入口和 Symfony 框架安装配置说明。

下载
  • $event->isMasterRequest() 过滤子请求(如嵌入的 ESI 或 render())
  • 检查 $request->getPathInfo() 是否匹配 ^/(health|ping|bundles|css|js|images)
  • 跳过 CLI 环境:if (PHP_SAPI === 'cli') return;

注意:不要依赖 $request->isXmlHttpRequest() 来过滤,它只判断 X-Requested-With: XMLHttpRequest 头,对普通 API 调用无效。

记录地址时别只记 path,要保留 query 和 host 差异

同一个路由(如 blog_show)可能对应多个实际访问地址:https://example.com/blog/123https://admin.example.com/blog/456?ref=mailhttp://localhost:8000/blog/789。如果只记录 $request->getPathInfo(),就丢失了协议、host、query 等关键上下文,排查问题时无法还原真实请求来源。

建议统一记录 $request->getUri()(返回完整 URI 字符串),或至少组合:

$fullUrl = $request->getSchemeAndHttpHost() . $request->getRequestUri();

另外,若应用部署在反向代理后(如 Nginx + PHP-FPM),需确认 trusted_proxies 配置已设置,否则 getUri() 可能返回 http://localhost:8000 而非真实客户端地址。

相关文章

路由优化大师
路由优化大师

路由优化大师是一款及简单的路由器设置管理软件,其主要功能是一键设置优化路由、屏广告、防蹭网、路由器全面检测及高级设置等,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

symfony 路由

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
PHP Symfony框架
PHP Symfony框架

本专题专注于PHP主流框架Symfony的学习与应用,系统讲解路由与控制器、依赖注入、ORM数据操作、模板引擎、表单与验证、安全认证及API开发等核心内容。通过企业管理系统、内容管理平台与电商后台等实战案例,帮助学员全面掌握Symfony在企业级应用开发中的实践技能。

2025.09.11

4317

17

PHP API接口开发与RESTful实践
PHP API接口开发与RESTful实践

本专题聚焦 PHP在API接口开发中的应用,系统讲解 RESTful 架构设计原则、路由处理、请求参数解析、JSON数据返回、身份验证(Token/JWT)、跨域处理以及接口调试与异常处理。通过实战案例(如用户管理系统、商品信息接口服务),帮助开发者掌握 PHP构建高效、可维护的RESTful API服务能力。

2025.11.26

504

16

Aionclaw智能助手介绍
Aionclaw智能助手介绍

本专题汇总了AionClaw(AI龙虾助手)的功能介绍与在线使用入口。AionClaw是杭州趣猿人工智能有限公司推出的桌面级AI智能体,能直接在电脑上读写文件、运行脚本、操作浏览器,自动交付Word、PPT、Excel等成品。

2026.09.20

0

13

AionClaw AI智能体与电脑自动化任务执行功能使用教程
AionClaw AI智能体与电脑自动化任务执行功能使用教程

AionClaw专题整理AI智能体与电脑自动化相关功能使用教程,涵盖安装部署、AI任务执行、Skills技能、文件处理、浏览器控制、电脑操作、持久记忆、聊天工具连接以及办公、编程和内容创作等功能,帮助用户快速掌握AionClaw的实际使用方法。

2026.09.20

0

15

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

2026.09.16

160

9

ai生成视频的工具免费版合集
ai生成视频的工具免费版合集

本专题汇总了当前免费AI生成视频工具的排行榜与推荐清单,涵盖seko、讯飞智作、AniShort及剧云、Lovart等多模型集成平台。同时整理了各工具的免费额度、输出时长、水印政策及适用场景差异,助您快速选择合适工具开启AI视频创作。

2026.09.16

60

10

Pandas时间序列分析与可视化报表
Pandas时间序列分析与可视化报表

本专题整理Pandas日期转换、时间索引、重采样、滚动窗口、时区处理、plot绘图、Styler表格样式和报表输出方法。

2026.09.16

80

23

Pandas数据筛选索引与清洗处理
Pandas数据筛选索引与清洗处理

本专题整理Pandas中的loc、iloc、条件筛选、query查询、缺失值处理、重复值删除、类型转换和字符串列清洗方法。

2026.09.16

60

25

Pandas数据读取导入与文件导出处理
Pandas数据读取导入与文件导出处理

本专题整理Pandas读取CSV、Excel、JSON、SQL、Parquet等文件的方法,以及to_csv、to_excel、to_sql和to_parquet等常用数据导出流程。

2026.09.16

40

27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Symfony 官方文档
Symfony 官方文档

共0课时 | 0人学习

Composer手册
Composer手册

共0课时 | 0人学习

Symfony5【从0开始开发博客系统】
Symfony5【从0开始开发博客系统】

共120课时 | 15万人学习