Livewire验证需手动触发且字段路径必须严格匹配,否则@error不显示;rules()仅定义规则不自动执行,须调用validate()或validateOnly();失焦验证需wire:model.blur与updated()联动,@error括号内路径须与validateOnly()参数完全一致。

Livewire 验证不是“写个 rules() 就自动跑”,必须手动触发、字段名严格匹配、错误绑定路径不能错,否则 @error 永远不显示。
rules() 方法定义规则但不自动执行
Livewire 组件里的 rules() 只是返回一个规则数组,它不会在任何时机自动调用。即使你写了 'email' => 'required|email',只要没显式调用 $this->validate() 或 $this->validateOnly(),服务端验证就根本没发生。
常见误操作:
- 只写
rules(),然后指望wire:model.blur="email"自动校验 —— 不会 - 在
submit()末尾才调用$this->validate()—— 错误已产生,视图可能来不及刷新 - 把
$this->validateOnly('email')放在修改$this->email的赋值语句之后 —— 验证用的是旧值
wire:model.blur 触发 updated() + validateOnly()
失焦验证是最稳的实时校验方式,关键在两处联动:Blade 中用 wire:model.blur="email",组件中在 updated() 里判断并调用 validateOnly()。
示例写法:
public function updated($propertyName)
{
if ($propertyName === 'email') {
$this->validateOnly('email');
}
}
注意点:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
-
$propertyName是字符串,比如'user.email'(不是'email'),如果字段嵌套在模型里,@error('user.email')才能匹配 -
validateOnly()失败时会自动填充$errors并刷新视图,但不会中断后续 PHP 逻辑 —— 所以别把它写在可能改状态的代码后面 - 避免对所有字段无差别调用
validateOnly($propertyName),尤其是含文件或复杂规则的字段,容易引发抖动
@error('field') 必须与 validateOnly 字段路径完全一致
@error() 是纯读取器,只从当前请求上下文里捞已存在的错误消息。它不触发验证,也不做任何计算。
典型失效场景:
- Blade 中写
@error('email'),但组件里用的是wire:model="user.email"→ 应该写@error('user.email') - 规则定义为
'photo' => 'image|mimes:png,jpg',但上传字段绑的是wire:model="profile.photo"→@error('profile.photo')才有效 - 动态字段如
pageelements.*.value,错误键是pageelements.0.value,但模板里写@error("pageelements.{$key}.value")—— Blade 不支持在@error内插值,得用@error("pageelements.{$key}.value")的等效写法:先用@foreach($errors->get("pageelements.{$key}.value") as $message)
文件上传和自定义规则要特别处理参数传递
文件上传首次验证失败,大概率是因为 $this->photo 还没变成 UploadedFile 实例,就进了 validateOnly();自定义规则里依赖其他字段(比如 timeslot 要结合 employee_id 校验),不能靠 request('employee_id') —— Livewire 子请求里 request() 不可靠。
正确做法:
- 文件上传验证单独写
updatedPhoto()方法,加sleep(100)或检查is_object($this->photo)再验证(仅调试用) - 自定义规则构造函数接收当前组件属性值:
new TimeSlotEmployeeRule($this->employee_id),然后在rules()里引用 - 规则类里不要用
request(),所有依赖数据都应通过构造参数传入
最常被跳过的细节:Livewire 的错误存储桶是按完整字段路径索引的,不是按变量名或表单逻辑分组的。写错一个点、多一个 s、漏一层嵌套,@error 就静默失效 —— 它不会报错,只会不显示。










