执行Laravel Artisan命令时出现__set_state()方法未定义错误
问题解决:Call to undefined method App\Models\Unidades::__set_state()
执行php artisan config:clear或php artisan route:clear时触发这个错误,本质是PHP反序列化模型实例时缺少__set_state魔术方法。Laravel在缓存配置、路由这类操作时,会序列化相关文件中的内容,如果你的配置文件、路由文件或服务提供者里直接引用了Unidades模型的实例(比如Unidades::first()这种写法),缓存过程中就会尝试反序列化这个模型对象,而默认Eloquent模型没有内置__set_state方法,就会报错。
你已经添加了HasFactory,但这个和__set_state无关,下面是具体解决步骤:
排查并修正模型实例的不当引用:
检查所有配置文件(config/目录下)、路由文件(routes/下)以及服务提供者(app/Providers/),看看有没有直接返回或使用Unidades模型实例的代码。比如如果在某个配置文件里写了:'default_unidade' => Unidades::where('nome', '总部')->first(),这种写法会把模型对象存入配置缓存,必须改成存储标量值(比如ID),然后在业务代码里通过ID查询模型:
'default_unidade_id' => 1,之后在需要用的地方写
Unidades::find(config('app.default_unidade_id'))。临时应急修复(不推荐长期使用):
如果暂时找不到引用位置,可以给Unidades模型手动添加__set_state方法,让PHP能正常反序列化模型对象:<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Unidades extends Model { use HasFactory; protected $fillable = [ 'nome', 'endereco', 'telefone', 'coordenador', 'diretor_tecnico', 'responsavel_tecnico_da_enfermagem', 'responsavel_tecnico_da_farmacia', 'inicio', 'termino', 'imagem', 'nome_abreviado', 'arquivos' ]; public static function __set_state($data) { $model = new self(); foreach ($data as $key => $value) { $model->$key = $value; } return $model; } }清理残留缓存:
修复后,执行以下命令彻底清理缓存:php artisan cache:clear php artisan config:clear php artisan route:clear
内容的提问来源于stack exchange,提问作者EduardoK
相关产品推荐
相关产品推荐

