自定义规则 Laravel Livewire

问题描述 投票:0回答:2

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

输入:

<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,

删除可为空的工作正常,但该字段不是必需的。对于可为 null 的属性,我收到以下错误:

未找到用于验证的属性:[0]

有什么建议吗?非常感谢您花时间接受我的咨询

php laravel laravel-livewire laravel-7 laravel-validation
2个回答
1
投票

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

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

查看 livewire 验证文档


0
投票

我解决这个问题的方法是利用 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.');
        }
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.