在 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]
有什么建议吗?非常感谢您花时间接受我的咨询
我解决这个问题的方法是利用 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.');
}
}
}