主题
#[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">Save Post</button>
</div>使用 #[Validate],Livewire 会在每次更新时自动验证属性,为用户提供即时反馈。
工作原理
当你向属性添加 #[Validate] 时:
- 自动验证 - 属性在每次更新时都会被验证
- 实时反馈 - 用户立即看到验证错误
- 手动验证 - 你仍然在保存之前调用
$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: 'Please provide a post title')] // [tl! highlight]
public $title;对于多个规则,使用多个属性:
php
#[Validate('required', message: 'Please provide a post title')]
#[Validate('min:3', message: 'This title is too short')]
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', 'Message sent successfully!');
$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="Your name">
@error('name') <span class="error">{{ $message }}</span> @enderror
</div>
<div>
<input type="email" wire:model.blur="email" placeholder="Your email">
@error('email') <span class="error">{{ $message }}</span> @enderror
</div>
<div>
<input type="text" wire:model.blur="subject" placeholder="Subject">
@error('subject') <span class="error">{{ $message }}</span> @enderror
</div>
<div>
<textarea wire:model.blur="message" placeholder="Your message"></textarea>
@error('message') <span class="error">{{ $message }}</span> @enderror
</div>
<button type="submit">Send Message</button>
</form>
</div>用户在填写表单时会获得即时反馈,具有友好的字段名称和有帮助的错误消息。
了解更多
有关验证的全面文档,包括表单对象、自定义规则和测试,请参阅验证文档。
参考
php
#[Validate(
mixed $rule = null,
?string $attribute = null,
?string $as = null,
mixed $message = null,
bool $onUpdate = true,
bool $translate = true,
)]| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
$rule | mixed | null | 要应用的验证规则 |
$attribute | ?string | null | 验证错误消息的自定义属性名称 |
$as | ?string | null | 在验证错误消息中显示的友好名称 |
$message | mixed | null | 验证失败的自定义错误消息 |
$onUpdate | bool | true | 是否在属性更新时运行验证 |
$translate | bool | true | 是否翻译验证消息 |