推荐在模型 beforewrite 钩子中统一调用文本审核 api,避免控制器重复校验;需启用事件、抛出 validateexception 中断保存;建议缓存审核结果;对接云厂商时宜用 http 简调而非 sdk,注意签名编码与 accesskey 状态,并明确审核结果的业务语义。

模型保存前自动调用文本审核 API
ThinkPHP 模型本身不内置内容安全扫描,必须在 save() 或 create() 前手动介入。推荐在模型的 beforeWrite 钩子中统一处理,避免业务层重复写校验逻辑。
关键点:钩子执行时机早于数据写入,且能直接修改 $this->data 或抛出异常中断保存。不要在控制器里做审核——容易遗漏、难复用、违反单一职责。
- 确保模型启用事件:在模型类顶部加
protected $event = ['before_write' => 'beforeWrite']; - 审核失败必须
throw new ValidateException('含违规内容'),否则会静默跳过 - 只对字符串字段审核,跳过
id、status、create_time等非文本字段 - 建议缓存审核结果(如 Redis),相同内容 5 分钟内不再重复请求,避免限流或超时拖慢响应
对接阿里云 / 腾讯云文本审核 SDK 的坑
官方 SDK 默认依赖 Guzzle 7+,但 ThinkPHP 6.0.x 常用的 topthink/framework v6.0.9 仍锁死 Guzzle 6,直接 composer require 会冲突。别硬升 Guzzle,改用最简 HTTP 方式调用。
以腾讯云为例,用 think\facade\Http 发送 POST 请求比引入完整 SDK 更稳:
$response = \think\facade\Http::post('https://nlp.tencentcloudapi.com', [
'Action' => 'TextModeration',
'Version' => '2018-11-19',
'Region' => 'ap-guangzhou',
'Text' => $content,
// 其他签名参数(SecretId、Timestamp、Signature 等需按腾讯云文档生成)
]);
- 签名生成必须用 UTF-8 原始字符串,
mb_convert_encoding($str, 'UTF-8', 'auto')预处理防止乱码误判 - 阿里云返回
Forbidden.AccessKeyDisabled多因 AccessKey 被控制台禁用,不是密钥错——去 RAM 控制台确认状态 - 腾讯云返回
FailedOperation.UnrealText表示文本过短(trim() +strlen()校验
敏感字段白名单与性能兜底策略
不是所有字段都要过审。标题、评论、用户昵称必须审;分类名、标签、地址字段视业务定;而 is_deleted、sort 这类纯数字字段完全没必要调 API。
白名单硬编码在模型里最可控:
protected $sensitiveFields = ['title', 'content', 'nickname', 'remark'];
- 字段值为空或仅含空白符(
!trim($value))直接跳过审核,省请求、防空内容误报 - 单次保存涉及多个敏感字段时,合并为一个 API 请求(如腾讯云支持批量
Text数组),而非每个字段单独调一次 - 生产环境必须设超时:HTTP 客户端
timeout(3),失败后记录日志并降级为「人工复核」标记(如写入audit_status = 2),不能阻塞主流程
本地开发绕过审核的快捷方式
开发阶段频繁触发审核既费钱又慢,但又不能删掉钩子逻辑。最简单的是通过环境变量开关:
在 .env 中加一行:AUDIT_ENABLED=false,然后在钩子里判断:
if (env('AUDIT_ENABLED', true) === false) {
return;
}
- 切勿用
APP_DEBUG判断——线上 debug 关了但审核仍需运行 - 测试时可模拟返回固定结果(如
return ['Suggestion' => 'pass']),但要确保结构与真实 API 一致,避免后续解析出错 - CI/CD 流水线中应强制
AUDIT_ENABLED=true,防止带漏洞代码合入主干
真正麻烦的不是调 API,而是审核结果和业务状态怎么对齐:比如「建议人审」该算成功还是失败?字段要不要回填审核 ID?这些细节没约定清楚,上线后运营就会卡在工单里等你改逻辑。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










