Skip to content

Validate

#[Validate] 属性将验证规则与组件属性关联,实现自动实时验证和简洁的规则声明。

基本用法

#[Validate] 属性应用到需要验证的属性上:

php
<?php // resources/views/components/post/⚡create.blade.php

use Livewire\Attributes\Validate;
use Livewire\Component;
use App\Models\Post;

new class extends Component
{
    #[Validate('required|min:3')] // [tl! highlight]
    public $title = '';

    #[Validate('required|min:3')] // [tl! highlight]
    public $content = '';

    public function save()
    {
        $this->validate();

        Post::create([
            'title' => $this->title,
            'content' => $this->content,
        ]);

        return redirect('/posts');
    }
};
?>

<div>
    <input type="text" wire:model="title">
    @error('title') <span class="error">{{ $message }}</span> @enderror

    <textarea wire:model="content"></textarea>
    @error('content') <span class="error">{{ $message }}</span> @enderror

    <button wire:click="save">保存帖子</button>
</div>

使用 #[Validate],Livewire 会在每次更新时自动验证属性,为用户提供即时反馈。

工作原理

当您向属性添加 #[Validate] 时:

  1. 自动验证 - 属性在每次更新时都会被验证
  2. 实时反馈 - 用户立即看到验证错误
  3. 手动验证 - 您仍需在保存前调用 $this->validate() 以确保所有属性被验证

实时验证

默认情况下,#[Validate] 在属性更新时验证它们:

php
<?php // resources/views/components/⚡registration.blade.php

use Livewire\Attributes\Validate;
use Livewire\Component;

new class extends Component
{
    #[Validate('required|email|unique:users,email')]
    public $email = '';

    #[Validate('required|min:8')]
    public $password = '';
};
?>

<div>
    <input type="email" wire:model.blur="email">
    @error('email') <span>{{ $message }}</span> @enderror

    <input type="password" wire:model.blur="password">
    @error('password') <span>{{ $message }}</span> @enderror
</div>

当用户填写表单时,他们会立即收到验证反馈。

禁用自动验证

要仅在显式调用 $this->validate() 时验证,请使用 onUpdate: false

php
<?php // resources/views/components/post/⚡create.blade.php

use Livewire\Attributes\Validate;
use Livewire\Component;
use App\Models\Post;

new class extends Component
{
    #[Validate('required|min:3', onUpdate: false)] // [tl! highlight]
    public $title = '';

    #[Validate('required|min:3', onUpdate: false)] // [tl! highlight]
    public $content = '';

    public function save()
    {
        $validated = $this->validate();
        Post::create($validated);
        return redirect('/posts');
    }
};

现在验证仅在调用 save() 时运行,而不是在每次属性更新时。

自定义属性名称

自定义验证消息中的字段名称:

php
#[Validate('required', as: 'date of birth')] // [tl! highlight]
public $dob;

错误消息将是“The date of birth field is required”而不是“The dob field is required”。

自定义验证消息

覆盖默认验证消息:

php
#[Validate('required', message: '请提供帖子标题')] // [tl! highlight]
public $title;

对于多个规则,使用多个属性:

php
#[Validate('required', message: '请提供帖子标题')]
#[Validate('min:3', message: '此标题太短')]
public $title;

数组验证

验证数组属性及其子项:

php
<?php // resources/views/components/⚡task-list.blade.php

use Livewire\Attributes\Validate;
use Livewire\Component;

new class extends Component
{
    #[Validate([
        'tasks' => 'required|array|min:1',
        'tasks.*' => 'required|string|min:3',
    ])]
    public $tasks = [];

    public function addTask()
    {
        $this->tasks[] = '';
    }
};

这会验证数组本身和每个单独的任务。

限制

不支持 Rule 对象

PHP 属性不能直接使用 Laravel 的 Rule 对象。对于 Rule::exists() 等复杂规则,请改用 rules() 方法:

php
protected function rules()
{
    return [
        'email' => ['required', 'email', Rule::unique('users')->ignore($this->userId)],
    ];
}

何时使用

在以下情况下使用 #[Validate]

  • 构建具有实时验证反馈的表单
  • 将验证规则与属性定义放在一起
  • 创建简单、可读的验证逻辑
  • 实现内联验证以获得更好的用户体验

在以下情况下使用 rules() 方法:

  • 您需要 Laravel 的 Rule 对象
  • 规则依赖于动态值
  • 您正在处理复杂的条件验证
  • 您偏好集中的规则定义

示例:联系表单

以下是带有验证的完整联系表单:

php
<?php // resources/views/pages/⚡contact.blade.php

use Livewire\Attributes\Validate;
use Livewire\Component;
use App\Mail\ContactMessage;
use Illuminate\Support\Facades\Mail;

new class extends Component
{
    #[Validate('required|min:2', as: 'name')]
    public $name = '';

    #[Validate('required|email')]
    public $email = '';

    #[Validate('required')]
    public $subject = '';

    #[Validate('required|min:10', as: 'message')]
    public $message = '';

    public function submit()
    {
        $validated = $this->validate();

        Mail::to('support@example.com')->send(new ContactMessage($validated));

        session()->flash('success', '消息发送成功!');

        $this->reset();
    }
};
?>

<div>
    @if (session('success'))
        <div class="alert">{{ session('success') }}</div>
    @endif

    <form wire:submit="submit">
        <div>
            <input type="text" wire:model.blur="name" placeholder="您的姓名">
            @error('name') <span class="error">{{ $message }}</span> @enderror
        </div>

        <div>
            <input type="email" wire:model.blur="email" placeholder="您的电子邮件">
            @error('email') <span class="error">{{ $message }}</span> @enderror
        </div>

        <div>
            <input type="text" wire:model.blur="subject" placeholder="主题">
            @error('subject') <span class="error">{{ $message }}</span> @enderror
        </div>

        <div>
            <textarea wire:model.blur="message" placeholder="您的消息"></textarea>
            @error('message') <span class="error">{{ $message }}</span> @enderror
        </div>

        <button type="submit">发送消息</button>
    </form>
</div>

用户在填写表单时会立即得到反馈,并带有友好的字段名称和有用的错误消息。

了解更多

有关验证的全面文档,包括表单对象、自定义规则和测试,请参阅验证文档