You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:20:40