Livewire V3 创建表单wire:model绑定对象属性为null问题
Livewire V3 创建表单时无法绑定模型字段的问题
我正在使用Livewire V3开发一个集编辑与创建功能于一体的表单,采用将模型传入mount方法、无模型时自动创建新对象的实现方式。但当使用wire:model="domain.name"进行绑定并提交表单时,系统提示name字段为null。在创建表单场景下,Livewire为何无法正确关联并赋值该字段?
组件代码
<?php namespace App\Livewire\Site\Forms\Domains; use Livewire\Attributes\Validate; use Livewire\Component; use App\Models\Domain; class DomainForm extends Component { public Domain $domain; public function mount(Domain $domain) { $this->domain = $domain; } public function rules() { return [ 'domain.name' => ['required'] ]; } public function submit() { $this->validate(); } public function render() { return view('livewire.site.forms.domains.domain-form'); } }
视图代码
<x-input id="name" type="text" class="mt-1 block w-full" wire:model.defer="domain.name" placeholder="e.g: example.com" />
问题原因
- 路由隐式绑定的限制:当你声明
Domain $domain作为mount方法参数时,Laravel的路由绑定只会在存在对应ID的情况下返回模型实例,不会自动创建空模型。如果是创建场景(路由无domain ID参数),会直接抛出404错误,而非生成空的Domain对象,导致你以为的“自动创建新对象”逻辑根本没生效。 - 模型可填充性缺失:即使手动创建了空模型,如果Domain模型的
$fillable数组未包含name字段,Livewire无法通过wire:model为该字段赋值。
解决方法
手动处理空模型场景
修改mount方法,允许参数为null,手动初始化新模型:public function mount(?Domain $domain = null) { $this->domain = $domain ?? new Domain(); }这样路由不传domain ID时,会自动创建新的Domain实例,确保绑定有效。
配置模型可填充字段
在App\Models\Domain中添加name到$fillable数组:class Domain extends Model { protected $fillable = ['name']; }可选:简化验证规则
利用Livewire的属性验证特性,直接在模型属性上声明验证规则,代码更简洁:use Livewire\Attributes\Validate; class DomainForm extends Component { #[Validate('required')] public Domain $domain; // 其余代码不变 }
完成以上修改后,创建场景下的模型实例会被正确初始化,wire:model.defer="domain.name"能正常将输入值绑定到模型字段,提交时可通过验证。
内容的提问来源于stack exchange,提问作者Ryan H
相关产品推荐
相关产品推荐

