Respect Validation(PHP Slim):如何基于属性+规则自定义验证消息?
实现不同字段同规则的差异化自定义验证消息
当然可以实现!针对你遇到的nombre和dni字段,虽然都用了length验证规则但参数不同、需要返回不同提示的需求,这里有两种实用方案供你选择:
方案一:在定义验证规则时直接绑定专属消息
你可以在每个字段的length规则后,通过message()方法直接指定该字段的自定义提示。这种方式让规则和消息一一对应,直观又清晰:
$casoValidator = Validator::attribute('nombre', Validator::allOf( Validator::stringType(), Validator::notOptional()->message('{{name}} no es opcional'), Validator::stringType()->length(3, 100)->message('{{name}}不能少于3个字符或超过100个字符') )) ->attribute('idUsuario', Validator::allOf(Validator::intType())) ->attribute('numeroSertel', Validator::allOf( Validator::stringType(), Validator::stringType()->length(1, 100)->message('{{name}} no puede tener mas de 100 caracteres ni menos de uno') )) ->attribute('dni', Validator::allOf( Validator::stringType(), Validator::stringType()->length(8, 20)->message('{{name}}不能少于8个字符或超过20个字符') )); try { $casoValidator->assert($asunto); // 注意你原代码里的变量名$asuntoValidator可能是笔误,建议统一成$casoValidator } catch(NestedValidationException $exception) { // 这里直接获取所有验证失败的消息即可,无需在findMessages里重复定义 $errors = $exception->getMessages(); }
方案二:在异常捕获时通过「字段名.规则名」精准匹配
如果希望集中管理所有自定义消息,可以在findMessages()里使用字段名.规则名作为键,这样就能精准区分不同字段的同一条规则:
$casoValidator = Validator::attribute('nombre',Validator::allOf(Validator::stringType(),Validator::notOptional(), Validator::stringType()->length(3,100))) ->attribute('idUsuario',Validator::allOf(Validator::intType())) ->attribute('numeroSertel',Validator::allOf(Validator::stringType(), Validator::stringType()->length(1,100))) ->attribute('dni',Validator::allOf(Validator::stringType(), Validator::stringType()->length(8,20))); try { $casoValidator->assert($asunto); } catch(NestedValidationException $exception) { $errors = $exception->findMessages([ 'nombre.length' => 'nombre不能少于3个字符或超过100个字符', 'dni.length' => 'dni不能少于8个字符或超过20个字符', 'numeroSertel.length' => '{{name}} no puede tener mas de 100 caracteres ni menos de uno', 'nombre.notOptional' => '{{name}} no es opcional', // 其他规则消息... ]); }
补充说明
这两种方案的核心是验证库支持规则级别的消息绑定和字段+规则的精准消息映射,完全能满足你差异化提示的需求。你可以根据代码习惯选择:如果喜欢规则和消息紧密关联,选方案一;如果偏好集中管理所有提示文本,选方案二。
内容的提问来源于stack exchange,提问作者JoseCarlosPB
相关产品推荐
相关产品推荐

