Laravel Livewire 项目可空contract字段的条件接受校验问题
问题原因
你之前的写法问题在于:固定把contract字段的校验规则加入了校验逻辑,accepted规则默认要求字段值必须为可识别的「确认」值(on/1/true/yes),哪怕前端没有渲染该复选框,只要规则存在就会触发校验失败。
解决方案
可以通过以下两种方式实现「仅项目存在合同时才校验合同接受状态」的需求:
方法1:动态拼接校验规则(最直观,无版本依赖)
直接根据当前项目的contract字段判断是否需要添加校验规则,逻辑清晰不容易出错:
// Component 中写法 $rules = [ // 此处写你的其他字段校验规则 ]; // 只有项目存在合同时,才追加合同接受的校验规则 if ($this->project->contract) { $rules['contract'] = 'accepted'; } $this->validate($rules);
方法2:使用Laravel内置条件校验规则
Laravel 8及以上版本可以直接用Rule::when条件规则实现,不需要手动拼接规则数组:
use Illuminate\Validation\Rule; $this->validate([ // 此处写你的其他字段校验规则 'contract' => Rule::when($this->project->contract, 'accepted'), ]);
Rule::when的第一个参数为判断条件,条件成立时才会应用后面的校验规则,条件不成立时会直接跳过该字段的校验。
内容的提问来源于stack exchange,提问作者Okan K
相关产品推荐
相关产品推荐

