配置SYMFONY_DEPRECATIONS_HELPER后回溯无有效触发代码如何解决
问题根因
输出的回溯栈无参考价值,核心原因是Drupal测试框架的弃用监听器默认启用延迟聚合上报机制:测试运行时触发的所有弃用通知不会立刻输出,而是暂存在内存中,等整个测试方法执行完成后,在测试结束钩子中统一批量上报。此时生成的调用栈只会保留上报节点的框架内部调用链路,完全丢失弃用实际触发位置的上下文。
配置调整步骤
按以下方法修改即可获取包含业务代码位置的有效回溯:
- 调整phpunit.xml中
SYMFONY_DEPRECATIONS_HELPER的配置格式,不要直接传入裸正则,改用键值对格式开启完整栈输出、自动过滤框架内部栈帧:
<env name="SYMFONY_DEPRECATIONS_HELPER" value="verbose=1&filter=/Relying on entity queries to check access/&keep-vendor-stack=0" />
各配置项作用:
verbose=1:强制输出完整原始调用栈,不做内容截断filter=正则规则:保留原有目标弃用匹配逻辑,仅捕获指定的弃用提示keep-vendor-stack=0:自动过滤vendor目录、Drupal核心、PHPUnit框架的内部栈帧,直接展示自定义模块、业务代码的调用位置
- 关闭Drupal的弃用延迟上报逻辑:在测试bootstrap文件或者自定义测试基类的初始化方法中加入如下代码,让弃用通知触发时立刻被Symfony弃用助手捕获,不做暂存延迟上报:
// 注册错误处理器,绕过Drupal的弃用缓存逻辑 set_error_handler( ['Symfony\Bridge\PhpUnit\DeprecationErrorHandler', 'handleError'], E_USER_DEPRECATED );
- 如果不想修改测试代码,也可以在执行phpunit命令时直接传入环境变量,临时绕过Drupal的输出拦截:
SYMFONY_DEPRECATIONS_HELPER="verbose=1&filter=/Relying on entity queries to check access/" ./vendor/bin/phpunit
调试提示:如果开启配置后仍未直接定位到业务代码,可临时将
keep-vendor-stack设为1查看完整原始栈,找到触发弃用的实体查询语句后,调用\Drupal\Core\Entity\Query\QueryInterface::accessCheck()传入TRUE或FALSE显式指定权限检查逻辑,即可修复该弃用问题。
内容的提问来源于stack exchange,提问作者joachim
相关产品推荐
相关产品推荐

