Laravel Livewire从组件中的验证器获得错误消息



在我的register表单中,我有一个username输入字段到表单中,我只想用下面的规则验证它:

'required|regex:/^[a-zA-Z]+$/u|min:5|max:15|unique:users'

和我想得到验证错误,并发送它与另一种方式来查看,而不是使用bags消息在视图中与Laravel实现。例如:

<input type="text" class="form-control"
name="username"
wire:model="username"
value="{{old('username')}}">

组件:

public function updatedUsername($username)
{
//$validator = $this->validate(['username' => 'required|regex:/^[a-zA-Z]+$/u|min:5|max:15|unique:users']);
$validator = $this->validateOnly($username,['username' => 'required|regex:/^[a-zA-Z]+$/u|min:5|max:15|unique:users']);
if ($validator->fail()) {
// ...
} else {
// ...
}
}

在这个Component我怎么能得到验证错误?

当使用validate()/validateOnly()时,如果验证失败将抛出异常。对于像@error('fieldName')这样的特性,Laravel会拦截这个验证错误,并在刀片模板中处理它。

为了在"实时"中钩入验证使用Livewire,您需要捕获该异常。为了获得@error('fieldName')的实时验证,您还应该在完成后重新抛出异常。

public function updated($field)
{
try {
$this->validateOnly($field);
} catch (IlluminateValidationValidationException $e) {
// Do your thing and use $validator here
$validator = $e->validator;
// ...
// Once you're done, re-throw the exception
throw $e;
}
}
您可能已经注意到,这里没有任何规则的定义。这是因为它们应该定义在受保护的属性$rules你的类(,除非你有一个真正令人信服的理由把它从全局规则集的组件)。
class Foo extends Component
{
protected $rules = [
'username' => 'required|regex:/^[a-zA-Z]+$/u|min:5|max:15|unique:users'
];

// ....
}

如果您需要在规则中引入其他属性或使用函数,您可以删除该属性并声明一个rules()方法——这没有很好的文档记录,因此可能有点晦涩。

class Foo extends Component
{
public function rules() 
{
return [
'username' => 'required|regex:/^[a-zA-Z]+$/u|min:5|max:15|unique:users'
];
}
}

旁注:您可能希望使用alpha规则而不是使用正则表达式。

必须检查if ($validator->fails())livewire为您做的

如果验证失败,将抛出一个标准的ValidationException(并被Livewire捕获),并且在组件的视图中可以使用标准的$errors对象。因此,在应用程序的其余部分处理验证的任何现有代码(如Blade包含)也将在这里应用。

只需将此添加到刀片文件中(最好在输入标签之后)

@error('username')
<div class="error-label">
{{ $message }}
</div>
@enderror

相关内容

最新更新