Laravel Livewire表单验证问题:required_if生效时仍触发Mimes验证报错
解决方案
你的问题出在Laravel验证规则的执行逻辑上:即使字段为null,max和mimes这类规则依然会被触发,除非你明确告诉验证器忽略null值或者仅在特定条件下验证该字段。以下是几种可行的解决办法:
方法一:添加nullable规则
给customLogo规则加上nullable,这样当logo不为custom时,customLogo为null会被允许,且仅当字段有值时才会验证max和mimes规则:
protected $rules = [ // 注意:你原来的domain规则重复了,保留覆盖后的那条即可 'domain' => ['required','regex:/([A-z]|\d+|\-|\.)+(.com|.co.id)$/'], 'logo' => ['required'], 'customLogo' => 'nullable|required_if:logo,custom|max:4096|mimes:png,svg', ];
方法二:使用exclude_unless规则
用exclude_unless替代required_if,这个规则会直接在logo不为custom时排除customLogo字段的所有验证,彻底避免不必要的规则触发:
protected $rules = [ 'domain' => ['required','regex:/([A-z]|\d+|\-|\.)+(.com|.co.id)$/'], 'logo' => ['required'], 'customLogo' => 'exclude_unless:logo,custom|required|max:4096|mimes:png,svg', ];
这里exclude_unless:logo,custom表示只有当logo等于custom时,才会对customLogo执行后续的required、max和mimes验证。
方法三:动态生成验证规则
利用Livewire支持的动态规则方法,根据logo的当前值动态决定是否添加customLogo的验证规则,这种方式灵活性最高:
public function rules() { $baseRules = [ 'domain' => ['required','regex:/([A-z]|\d+|\-|\.)+(.com|.co.id)$/'], 'logo' => ['required'], ]; // 仅当logo为custom时,添加customLogo的验证规则 if ($this->logo === 'custom') { $baseRules['customLogo'] = ['required', 'max:4096', 'mimes:png,svg']; } return $baseRules; }
之后依然用$this->validate()进行验证即可,Livewire会自动调用这个rules()方法获取动态规则。
内容的提问来源于stack exchange,提问作者Raden Bagus
相关产品推荐
相关产品推荐

