Laravel 8中Model的$fillable属性报类型不可定义错误如何解决?
错误原因
该错误是PHP类属性继承规则和Laravel版本特性共同导致的:
- Laravel 8.x版本的
Illuminate\Database\Eloquent\Model父类中,$fillable属性未声明array类型 - PHP 7.4及以上版本支持类属性类型声明,但要求子类重写父类属性时,若父类未指定属性类型,子类不可以额外添加类型声明。你的Setting模型给
$fillable加了array类型声明,违反了该继承规则,因此触发致命错误。
可行修复方案
方案1:移除$fillable的类型声明(最便捷,兼容当前环境)
直接删除$fillable前的array类型标识即可,修改后代码如下:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Setting extends Model { use HasFactory; protected $fillable = [ 'key', 'value', ]; protected $casts = [ 'value' => 'array', ]; }
方案2:升级Laravel版本
Laravel 9及以上版本已经对父类Model的$fillable属性补充了array类型声明,如果你可以升级运行环境(Laravel 9要求PHP 8.0及以上版本),升级到对应Laravel版本后原有带类型的代码可以正常运行。
方案3:使用$guarded替代$fillable
如果你不需要限制批量赋值的字段,可以直接用$guarded属性声明不允许批量赋值的字段为空,也可以解决问题,示例:
// 替换原有$fillable段为以下代码 protected $guarded = [];
注意:该方案会允许所有字段的批量赋值,使用前请确认没有注入风险,做好数据校验。
内容的提问来源于stack exchange,提问作者Chayan
相关产品推荐
相关产品推荐

