Laravel Livewire的$rules内用$this报错表达式不允许如何解决
你遇到的报错是PHP的语法限制:类属性声明阶段还未完成实例化,不允许使用$this调用实例属性,也不能执行字符串拼接这类动态操作,因此不能直接在声明$rules属性时拼接$this->record_id。
方案1(最推荐):用rules()方法替代属性
Livewire原生支持通过定义rules()方法返回校验规则,方法内部可以正常调用实例属性,完全兼容原有实时校验逻辑:
<?php // ... // 删掉原来的protected $rules属性声明,新增这个方法 protected function rules() { return [ // 注意你原规则里name重复写了min:4和min:2,会被后者覆盖,这里直接保留有效配置 'name' => 'required|min:2|max:255|unique:permissions,name,'.$this->record_id, 'guard_name' => 'required|min:2|max:255', 'permission' => 'required|min:2|max:255|unique:permissions,permission,'.$this->record_id, 'description' => 'required|min:5|max:255' ]; }
方案2:在mount生命周期中赋值$rules
如果你习惯用$rules属性,可以把属性的初始化放在实例化完成后的mount钩子中执行:
<?php // ... // 先声明空的规则属性 protected $rules = []; public function mount() { // mount阶段已经可以正常访问$this->record_id $this->rules = [ 'name' => 'required|min:2|max:255|unique:permissions,name,'.$this->record_id, 'guard_name' => 'required|min:2|max:255', 'permission' => 'required|min:2|max:255|unique:permissions,permission,'.$this->record_id, 'description' => 'required|min:5|max:255' ]; }
两种方案都不需要修改你原有实时校验的触发逻辑,Livewire会自动优先读取rules()方法的返回值,没有定义方法时才会读取$rules属性。
内容的提问来源于stack exchange,提问作者Pathros
相关产品推荐
相关产品推荐

