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

Laravel 10中带nullable的条件必填验证失效问题排查

问题原因

Laravel的验证规则按顺序执行,nullable规则的作用是:当字段值为null或空字符串时,直接跳过后续所有验证规则。你原来的代码里,自定义闭包放在nullable之后,所以当满足offer_type_id=1且use_default_company_description=false但company_description为空时,nullable已经让后续的闭包验证被跳过,自然不会触发错误提示。

解决方案

用Laravel内置的Rule::requiredIf()规则实现条件必填,它能和nullable完美共存:当条件不满足时,nullable生效允许字段为空;当条件满足时,强制要求字段必填。

步骤1:引入Rule类

use Illuminate\Validation\Rule;

步骤2:修改验证规则

'company_description' => [
    'string',
    'nullable',
    Rule::requiredIf(function () {
        return request()->input('offer_type_id') == 1 && request()->input('use_default_company_description') == false;
    }),
],

如果坚持要用自定义闭包,需要移除nullable,在闭包里同时处理两种场景:

'company_description' => [
    'string',
    function ($attribute, $value, $fail) {
        $isRequired = request()->input('offer_type_id') == 1 && request()->input('use_default_company_description') == false;
        
        if ($isRequired && (empty($value) || $value === '')) {
            $fail('Company description is required.');
        }
        // 非必填场景下,允许字段为空,无需额外处理
    },
],

不过这种写法不如内置规则简洁,更推荐第一种方案。

内容的提问来源于stack exchange,提问作者wojtek1904

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:08:12