FormRequest的messages()函数无法翻译required_if与prohibited_if规则
解决Laravel FormRequest中required_if/prohibited_if规则自定义消息不生效的问题
问题原因
当使用Rule::requiredIf()和Rule::prohibitedIf()这类规则对象时,Laravel无法通过messages()方法中的field.required_if或field.prohibited_if键名匹配到对应的规则(规则对象携带的动态参数导致键名匹配失败),因此会触发默认的英文提示。
解决方法
方法一:改用字符串形式的规则(适合简单条件场景)
将规则对象替换为字符串格式的验证规则,让Laravel可以正常匹配messages()方法中的键名。
修改后的rules()方法:
public function rules(Request $request) { return [ "name" => "required", "lastnames" => "required", "email" => [ "required", "email", Rule::unique('front_users', 'email')->ignore($request->id), ], // 替换Rule::requiredIf为字符串规则 "password" => "required_if:id,null", "role_id" => "required|exists:roles,id", "distributor_id" => [ "nullable", "exists:distributors,id", // 替换Rule::requiredIf为字符串规则 "required_if:role_id," . Role::DISTRIBUTOR, // 替换Rule::prohibitedIf为字符串规则(<>表示不等于) "prohibited_if:role_id,<>," . Role::DISTRIBUTOR, ], ]; }
此时你原来在messages()方法中定义的password.required_if、distributor_id.required_if、distributor_id.prohibited_if会正常生效,无需额外修改。
方法二:给Rule实例直接绑定自定义消息(适合复杂条件场景)
如果条件逻辑无法用字符串表达(比如依赖闭包判断),可以在创建Rule实例时调用message()方法直接绑定自定义消息,绕过键名匹配的问题。
修改后的rules()方法:
public function rules(Request $request) { return [ "name" => "required", "lastnames" => "required", "email" => [ "required", "email", Rule::unique('front_users', 'email')->ignore($request->id), ], "password" => [ // 直接给Rule实例绑定消息 Rule::requiredIf($request->id === NULL)->message('Tienes que proporcionar una contraseña para el usuario'), ], "role_id" => "required|exists:roles,id", "distributor_id" => [ "nullable", "exists:distributors,id", Rule::requiredIf($request->role_id == Role::DISTRIBUTOR)->message('Si el rol es distribuidor tienes que seleccionar el distribuidor al que pertenece.'), Rule::prohibitedIf($request->role_id != Role::DISTRIBUTOR)->message('No puedes seleccionar un distribuidor si el usuario no tiene dicho rol.'), ], ]; }
同时可以删除messages()方法中对应的password.required_if、distributor_id.required_if、distributor_id.prohibited_if键值对,避免冗余。
内容的提问来源于stack exchange,提问作者fombo
相关产品推荐
相关产品推荐

