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

Dol*_*rma 0 laravel laravel-livewire

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

'required|regex:/^[a-zA-Z]+$/u|min:5|max:15|unique:users'
Run Code Online (Sandbox Code Playgroud)

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

'required|regex:/^[a-zA-Z]+$/u|min:5|max:15|unique:users'
Run Code Online (Sandbox Code Playgroud)

成分:

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

在这Component我怎样才能得到验证错误?

Qir*_*rel 5

使用validate()/时validateOnly(),如果验证失败将会抛出异常。Laravel 将拦截此验证错误并在blade-template 中处理它,例如@error('fieldName').

为了使用 Livewire “实时”进行验证,您需要捕获该异常。要使用 进行实时验证@error('fieldName'),您还应该在完成后重新抛出异常。

public function updated($field)
{
    try {
        $this->validateOnly($field);
    } catch (\Illuminate\Validation\ValidationException $e) {
        // Do your thing and use $validator here
        $validator = $e->validator;

        // ...

        // Once you're done, re-throw the exception
        throw $e;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可能已经注意到,这里没有任何规则的定义。这是因为它们应该在您的类的受保护属性中定义$rules除非您有真正令人信服的理由将其排除在该组件的全局规则集中)。

class Foo extends Component
{
    protected $rules = [
        'username' => 'required|regex:/^[a-zA-Z]+$/u|min:5|max:15|unique:users'
    ];
    
    // ....
}
Run Code Online (Sandbox Code Playgroud)

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

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

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