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

Laravel Livewire getting error message from validator in component

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

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

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

<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 中,我如何得到验证错误?

不需要检查if ($validator->fails())livewire does that for you

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

只需将其添加到您的 blade 文件中(最好在输入标签之后)

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

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

等功能

为了使用 Livewire 连接到“real-time”中的验证,您需要捕获该异常。要使用 @error('fieldName') 获得 real-time 验证,您还应该在完成后 re-throw 异常。

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;
    }
}

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

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 规则。