升级 laravel 后需在 72 小时内修复 deprecated 警告:先确认运行版本与弃用范围,确保 app_debug=true 和日志驱动正确,再通过 grep 提取日志定位业务代码中的弃用调用(如 first()→firstwhere()、$this->attributes→getattribute()),最后清日志、触发请求、检查日志及测试套件验证修复效果。

升级 Laravel 框架后终端或日志中频繁出现 Deprecated 提示,说明代码正调用已被标记弃用的类、方法或参数,这些警告不会立即中断运行,但会在未来版本中彻底移除,必须在升级后 72 小时内定位并修复,否则可能引发线上故障。
确认当前 Laravel 版本与弃用范围
执行 php artisan --version 查看实际运行版本,注意区分安装版本与运行时加载版本——有时 Composer 安装了新版本,但 bootstrap/autoload.php 或 vendor/autoload.php 仍引用旧版核心文件;若输出为 Laravel Framework 13.2.0,需对照官方 升级指南 中 “Deprecated Features” 章节,重点关注 Illuminate\Container、Illuminate\Support\Str、Eloquent 的 hydrate() 和 all() 方法变更。
【关键前提】 必须确保 APP_DEBUG=true 且日志驱动为 single 或 daily,否则弃用警告不会写入 storage/logs/laravel.log,也无法被 grep 捕获。
从日志中精准提取弃用堆栈
进入项目根目录,运行以下命令提取最近 10 分钟内的弃用行:
grep -i "deprecated" storage/logs/laravel.log | grep "$(date -d '10 minutes ago' '+%Y-%m-%d')" | tail -n 20
该命令只抓取当日含 “deprecated” 的日志行,并限制为最近 20 条,避免被历史残留警告干扰;若无输出,检查 php.ini 中是否设置了 error_reporting = E_ALL & ~E_DEPRECATED —— 这会直接屏蔽所有弃用提示,必须改为 E_ALL 才能捕获。
观察每条日志末尾的文件路径与行号,例如:.../vendor/laravel/framework/src/Illuminate/Support/Str.php:328,这表示弃用发生在框架内部,无需修改;而 app/Http/Controllers/Admin/DashboardController.php:47 则是你的业务代码,必须立即处理。
定位自定义代码中的弃用调用
第一步:扫描全部 PHP 文件,查找高频弃用关键词
grep -rn "\-\>first\(\)" app/ --include="*.php"
第二步:过滤出真正触发弃用的方法调用(如 first() 在 Laravel 13 中已弃用,改用 firstWhere() 或 sole())
grep -rn "DB::table" app/ --include="*.php" | grep -E "(get\(\)|first\(\)|pluck\(\))"
第三步:检查模型访问器中是否使用了 $this->attributes['xxx'] 直接读取原始属性 —— Laravel 13 要求统一通过 $this->getAttribute('xxx') 或 $this->getOriginal('xxx') 访问,否则触发弃用警告;找到后逐个替换,不要全局替换,因为 getAttribute() 会触发访问器逻辑,getOriginal() 才返回数据库原始值。
注意:Model::all() 已弃用,但 User::all() 不会报错;真正触发警告的是 collect($users)->all() 这种 Collection 实例调用 all(),必须改为 collect($users)->values()->all() 或直接用 $users->toArray()。
快速验证修复效果
① 清空日志:执行 php artisan log:clear,避免旧日志干扰判断
② 触发一次典型请求:用 Postman 或 curl 访问一个已知调用过弃用方法的接口,例如 GET /api/v1/users
③ 立即检查日志:运行 tail -n 5 storage/logs/laravel.log,确认无新增 Deprecated 行
④ 静默运行测试套件:执行 ./vendor/bin/phpunit --filter=TestUserCreation,观察控制台是否仍有黄色警告输出;若有,说明测试代码本身也用了弃用语法,需同步修复
这一步操作起来很简单,直接把文件拖进去就行。











