自定义规则Laravel Livewire

zpgglvta  于 2022-11-26  发布在  其他
关注(0)|答案(2)|浏览(197)

在Laravel Livewire中我添加了一个自定义的youtube视频验证规则。它运行得很好,问题是我需要它是可空的,如果我添加了validate nullable,它会给我一个错误,我找不到如何解决这个问题。

输入:

<input wire:model="video" class="form-control" type="text" placeholder="Url youtube">

规则:

public function passes($attribute, $value)
        {
            return (bool) preg_match('/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/',$value);
        }

验证:

'video' => 'nullable', new RuleYoutube,

删除nullable可以很好地工作,但字段不是必需的。使用nullable属性时,我得到以下错误:
找不到要验证的属性:[0个]
有什么建议吗?非常感谢您花时间为我咨询

jtw3ybtb

jtw3ybtb1#

您可以在单个字符串管道中进行验证,也可以在数组中进行验证。

'video' => ['nullable', new RuleYoutube],

看看livewire validation docs

slhcrj9b

slhcrj9b2#

我解决这个问题的方法是利用Livewire的validateOnly方法和一个 invokable 验证规则。

public function updated($propertyName)
{
    if($propertyName == 'enquiry.contact_email'){
        $this->validateOnly('enquiry.contact_email', [
            'enquiry.contact_email' => [new DelimitedEmail, 'required']
        ]);
    }
}

可调用规则:php artisan make:rule DelimitedEmail --invokable
编码:

class DelimitedEmail implements InvokableRule
{
    public function __invoke($attribute, $value, $fail)
    {
        $func = function(string $value): string {
            return trim($value);
        };
        if(str_contains($value, ',')) {
            $emails = array_map($func,explode(',',$value));
            foreach($emails as $email) {
                if(!filter_var($email, FILTER_VALIDATE_EMAIL)) $fail('This field has an invalid email address.');
            }
        } else {
            if(!filter_var($value, FILTER_VALIDATE_EMAIL)) $fail('That is an invalid email address.');
        }
    }
}

相关问题