Laravel中为每个正则验证规则设置自定义密码错误提示
Laravel 为每个密码正则验证规则设置专属错误提示
你遇到的问题是:当使用多个字符串形式的regex规则时,Laravel无法区分不同的正则验证,所有规则共享同一个regex错误键,导致你尝试用password.regex.0这类索引式的自定义提示无法生效,只能返回默认的格式错误提示。
解决方案
改用Illuminate\Validation\Rule类的regex()和notRegex()方法来定义每个正则规则,每个规则可以单独设置专属的错误消息。这种方式能让Laravel识别每个独立的正则验证,从而返回对应的自定义提示。
修改后的代码示例
首先引入Rule类:
use Illuminate\Validation\Rule;
然后更新验证逻辑:
$request->validate([ 'password' => [ 'required', 'min:8', 'string', Rule::regex('/[a-z]/')->message('密码必须包含至少一个小写字母'), Rule::regex('/[A-Z]/')->message('密码必须包含至少一个大写字母'), Rule::regex('/[0-9]/')->message('密码必须包含至少一个数字'), Rule::regex('/[@$!%*#?&]/')->message('密码必须包含至少一个特殊字符(@$!%*#?&)'), Rule::notRegex('/^(20|19|0)/')->message('密码不能以20、19或0开头'), Rule::notRegex('/(.)\1{1}/')->message('密码不允许出现连续重复的字符'), Rule::notRegex('/(123(?:4(?:5(?:6(?:7(?:89?)?)?)?)?)?|234(?:5(?:6(?:7(?:89?)?)?)?)?|345(?:6(?:7(?:89?)?)?)?|456(?:7(?:89?)?)?|567(?:89?)?|6789?|789)/')->message('密码中连续数字不能超过2位'), ] ]);
原理说明
当你使用字符串形式的regex:/.../时,所有这类规则都会被映射到同一个regex验证规则标识下,Laravel无法区分不同的正则条件,因此无法匹配你设置的索引式消息键。而使用Rule::regex()方法时,每个规则都是一个独立的验证实例,各自携带自定义的错误消息,验证失败时会直接返回对应的提示内容。
内容的提问来源于stack exchange,提问作者Moshiur
相关产品推荐
相关产品推荐

