在yii2中验证字符串长度需在rules()中用string验证器设min/max,空值需额外required;支持单限、length数组或精确长度;可自定义tooshort/toolong提示;通过on参数按场景启用不同规则。

在Yii2中验证字符串长度,需在模型的rules()方法中声明string验证器,并明确指定最小或最大长度限制,否则字段可能被空值或超长内容绕过校验。
基础用法:限定长度范围
第一步:在模型类的rules()方法中添加规则数组项,使用string验证器并设置min和max参数。
['username', 'string', 'min' => 3, 'max' => 16]
这行代码表示username字段必须为字符串,且长度严格落在3~16个字符之间(含边界)。若输入“ab”,验证失败;输入“a”×17,同样失败。注意:该验证器默认不处理null或空字符串,如需拦截空值,必须额外搭配required规则。
灵活写法:只设一端限制
方法一:仅限制最小长度
['bio', 'string', 'min' => 10]
方法二:仅限制最大长度
['remark', 'string', 'max' => 200]
方法三:用length键一次性传入数组(等价于min/max)
['title', 'string', 'length' => [2, 50]]
三种写法效果一致,但length形式更紧凑。若只写length => 5,则表示**必须恰好5个字符**,不是“最多5个”——这是初学者高频踩坑点,务必核对文档语义。
增强体验:自定义错误提示
['nickname', 'string', 'min' => 2, 'max' => 12, 'tooShort' => '{attribute}不能少于{min, number}个字', 'tooLong' => '{attribute}不能超过{max, number}个字']
这里用tooShort和tooLong覆盖默认提示,支持{min}、{max}、{attribute}占位符。注意:{min, number}中的number是Yii内置的格式化类型,会自动添加千分位分隔符(如显示“2”而非“2.00”),避免手动拼接数字导致国际化异常。
场景联动:按不同业务阶段启用长度规则
① 定义注册场景专用规则:
['introduction', 'string', 'max' => 500, 'on' => 'signup']
② 定义编辑资料时放宽限制:
['introduction', 'string', 'max' => 1000, 'on' => 'update']
③ 在控制器中显式指定场景:
$model = new ProfileForm(['scenario' => 'update']);
场景(on)机制让同一字段在不同流程中拥有不同约束。若未设置scenario,规则默认在所有场景生效;若设置了但模型未进入对应场景,则该条规则完全不触发——这点常被忽略,导致测试时误判验证失效。











