Yii2中验证UUID需先trim和filter清洗字符串(转小写、去除非法字符),再用内置'uuid'验证器;若需兼容大写、花括号或无分隔符格式,应改用match正则或自定义内联验证方法。

在Yii2中验证用户输入的字符串是否符合UUID标准格式,避免因格式错误导致数据库写入失败或关联查询异常。
用内置validator快速验证
Yii2自带uuid验证器,直接在模型rules()中声明即可生效:
1. 在模型的rules()方法中添加规则:[['id'], 'uuid']
2. 该验证器默认只接受32位十六进制字符加4个短横线的标准格式(如550e8400-e29b-41d4-a716-446655440000),不接受大写、花括号包裹、或省略分隔符的变体。
3. 若需允许大写字母,加'strict' => false参数;否则严格区分大小写,550E8400-E29B-41D4-A716-446655440000会被判为非法。
自定义正则验证(兼容多种写法)
当业务需接受带花括号{...}、全大写、或无分隔符的UUID字符串时,内置validator不够用,必须手写正则:
方法一:用match验证器配合完整正则
[['id'], 'match', 'pattern' => '/^[{]?[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}[}]?$/']
⚠️ 注意:这个正则同时覆盖550e8400e29b41d4a716446655440000、{550e8400-e29b-41d4-a716-446655440000}、550E8400-E29B-41D4-A716-446655440000三种常见变体。
方法二:封装成内联验证方法,便于复用和调试
在模型中添加public方法:public function validateUuid($attribute, $params),内部用filter_var($this->$attribute, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => $pattern]])判断。
验证前先标准化字符串
用户粘贴的UUID常含空格、换行、不可见控制符,直接验证易失败:
第一步:在rules()中前置trim过滤
[['id'], 'trim']
第二步:再接filter转小写并去除非标准字符
[['id'], 'filter', 'filter' => function ($value) { return strtolower(preg_replace('/[^0-9a-f\-{}]/', '', $value)); }]
【关键前提】这一步必须放在uuid验证规则之前,否则带空格或大写的输入会直接被uuid验证器拒绝,不会进入后续清洗流程。
第三步:最后执行[['id'], 'uuid']验证


















