在我的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