两个模块都给同一方法加了 plugin,日志顺序却和 sortOrder 的直觉不一样。尤其出现 around 后,入口和返回阶段是嵌套的,只看一串日志很容易误判。

先画调用栈,不要只背排序规则

before 与 around 的进入顺序受配置排序影响,after 发生在返回过程。around 调用 $proceed() 前后的代码会包住后续链,所以日志常呈现:

before A
around A enter
before B
original method
after B
around A leave
after A

调试时为每个 plugin 打印类名、阶段和请求 ID,比只记录 plugin called 更容易确认链条。

around 不调用 proceed 会截断后续

第三方模块为了返回缓存结果,可能在条件分支直接 return。此时后面的 plugin 和原方法都不会执行。检查每条 return 路径,并确认参数、返回类型与目标方法兼容。

最终配置来自多个 di.xml 合并

同名 plugin 可以被其他模块禁用或覆盖,area 配置也会改变结果。检查模块加载顺序和生成的 interceptor。目标方法若是 final、static、构造函数或其他不可拦截范围,也不会按预期工作。

只需改参数时用 before,只改结果时用 after,确实需要包围调用再用 around。修复后用集成测试断言最终输入输出,不要把脆弱的完整日志顺序当成唯一业务契约。