You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置SYMFONY_DEPRECATIONS_HELPER后回溯无有效触发代码如何解决

问题根因

输出的回溯栈无参考价值,核心原因是Drupal测试框架的弃用监听器默认启用延迟聚合上报机制:测试运行时触发的所有弃用通知不会立刻输出,而是暂存在内存中,等整个测试方法执行完成后,在测试结束钩子中统一批量上报。此时生成的调用栈只会保留上报节点的框架内部调用链路,完全丢失弃用实际触发位置的上下文。

配置调整步骤

按以下方法修改即可获取包含业务代码位置的有效回溯:

  1. 调整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框架的内部栈帧,直接展示自定义模块、业务代码的调用位置
  1. 关闭Drupal的弃用延迟上报逻辑:在测试bootstrap文件或者自定义测试基类的初始化方法中加入如下代码,让弃用通知触发时立刻被Symfony弃用助手捕获,不做暂存延迟上报:
// 注册错误处理器,绕过Drupal的弃用缓存逻辑
set_error_handler(
    ['Symfony\Bridge\PhpUnit\DeprecationErrorHandler', 'handleError'],
    E_USER_DEPRECATED
);
  1. 如果不想修改测试代码,也可以在执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 01:21:34