psalm 支持通过插件机制和自定义规则精准识别业务异常,如负金额未校验、跳过审批、日志缺失等;需在psalm.xml注册插件类,实现对应钩子接口,并结合污点分析与框架语义提升准确性。

Psalm 支持通过插件机制和自定义规则(Custom Rules)精准识别业务特有的异常模式,比如“订单金额为负数未校验”“用户状态变更跳过审批流程”“敏感操作日志缺失”等。关键不在于堆砌规则,而在于让 Psalm 理解你的业务语义。
启用自定义规则支持
Psalm 默认不加载自定义规则,需显式注册:
- 在 psalm.xml 中添加配置段:
- 确保类文件路径被自动加载(如通过 Composer 的
autoload配置) - 规则类必须继承
Psalm\Plugin\Hook\AfterStatementAnalysisInterface或更合适的钩子接口(如FunctionReturnTypeProviderInterface用于返回值推断)
编写业务规则示例:拦截未校验的负金额赋值
以电商场景为例,若 Order::setAmount(float $amount) 被直接传入用户输入且无 > 0 判断,可定义规则捕获该模式:
- 监听
Assign语句,检查右侧是否为$_POST['amount']或类似外部输入表达式 - 向上追溯调用栈,确认是否进入
Order::setAmount方法 - 检查该方法所在类是否有
@psalm-assert或@psalm-assert-if-true注解声明金额合法性 - 若无校验逻辑,触发警告:
Unsafe external amount assignment without positive validation
复用框架语义增强业务判断
单纯语法匹配容易误报,结合框架特性可提升准确率:
- 为 Laravel/ThinkPHP 的请求对象方法(如
request()->input('amount'))标注@psalm-taint-source input,使 Psalm 将其标记为“污染源” - 在业务模型中使用
@psalm-assert-if-true "$this->amount > 0"声明验证契约,让后续分析信任该状态 - 配合
<taintanalysis></taintanalysis>启用污点传播,自动追踪“用户输入 → 金额字段 → 数据库写入”整条链路
集成到开发与交付流程
让规则真正起效,需落地执行环节:
- CI 中增加
vendor/bin/psalm --config=psalm.xml --error-level=1,将业务规则错误设为阻断项 - VS Code 安装 Psalm 插件,实时高亮问题行(需启用
psalm.languageServer) - 对高频误报规则,用
// @psalm-suppress NegativeAmountAssignment局部抑制,并附带 Jira 编号说明例外原因
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











