ThinkPHP 8.0中字符串前缀与子串校验须用原生startWith和contain规则:startWith:admin_校验开头,contain:a|contain:b实现多关键词任一匹配,嵌套数组需strict(true)配合tags.*.name通配符规则。

在ThinkPHP 8.0中为字符串字段添加前缀校验或子串存在性判断时,必须使用框架原生增强的startWith与contain规则,手动写正则不仅冗长易错,且无法复用错误提示、不兼容批量验证返回结构。
启用startWith规则校验字段开头
第一步:确认验证器类已通过命令行生成,避免命名空间或目录错误导致Class not found:php think make:validate UserValidate。
第二步:在app/validate/UserValidate.php的$rule数组中,为需校验前缀的字段(如username)添加startWith:admin_规则:
'username' => 'require|startWith:admin_'。
立即学习“PHP免费学习笔记(深入)”;
注意:【startWith后必须紧跟英文冒号和字面值,不能加空格,也不能用中文引号包裹】。若写成startWith: 'admin_'或startWith:"admin_",框架会静默跳过该规则,不报错也不校验。
第三步:调用验证时必须显式执行check(),例如控制器中:(new UserValidate())->check(['username' => 'user123']) → 返回false;而['username' => 'admin_test'] → 返回true。
用contain规则检查字符串是否含指定内容
方法一:基础用法——直接声明规则
在验证器$rule中写:'content' => 'require|contain:关键词'。这会检查$data['content']是否包含“关键词”三个连续汉字,区分大小写,不支持正则元字符。
方法二:多关键词任一匹配
ThinkPHP 8.0不支持contain:a,b,c语法。若需“包含a或b或c”,必须拆成多个规则并用|连接:'content' => 'require|contain:a|contain:b|contain:c'。只要其中任意一个contain成立即通过,全部失败才报错。
方法三:结合场景控制生效范围
若仅在search场景下启用contain,先在验证器中定义:protected $scene = ['search' => ['content']];调用时必须链式指定:(new UserValidate())->scene('search')->check($data)。不调scene(),该字段即使在$rule里写了也不会参与校验。
嵌套数组中对每个子项字段使用startWith
第一步:声明主字段为array类型,确保框架解析其内部结构:
'tags' => 'array' → 必须写,否则tags.0.name这类路径直接被忽略。
第二步:启用严格模式以激活通配符支持:
在验证器构造方法__construct()中添加:$this->strict(true)。默认strict为false,此时startWith在通配符规则下完全无效。
第三步:定义通配符规则,并显式绑定字段名:
'tags.*.name' => 'startWith:tag_'。注意这里不是tags.*,而是tags.*.name,表示对每个tags数组元素的name键做校验。
第四步:提交数据格式必须为标准索引数组,例如:['tags' => [['name' => 'tag_a'], ['name' => 'normal']]]。若传入关联键名如['tags' => ['first' => ['name' => 'tag_x']],tags.*.name将无法匹配任何项,校验形同虚设。



















