升级 laravel 需重点检查 php/扩展版本、迁移表前缀、视图文件名大小写及 phpunit.xml 的 coverage 配置,这些静默变更常导致无报错却功能异常。

升级前必须检查 composer.json 的 PHP 和扩展约束
很多升级失败不是 Laravel 本身的问题,而是 composer.json 里写的 "php": "^7.4" 还没改,但新版本 Laravel 要求 PHP 8.1+。Composer 会静默跳过不兼容的包,或者报错 Your requirements could not be resolved,但你可能只盯着 laravel/framework 看。
- 先运行
php -v确认当前 PHP 版本,再查目标 Laravel 版本的官方环境要求 -
composer.json中的"php"、"ext-mbstring"、"ext-openssl"等必须显式对齐,不能靠“应该有”蒙混 - Laravel 10+ 强制要求
ext-pdo和ext-json,旧项目如果跑在精简 Docker 镜像里容易漏装
php artisan migrate 在升级后报错 Base table or view not found
这不是迁移没跑,而是 Laravel 11 默认启用了「迁移表名自动加前缀」机制,而你的 database/migrations 文件里还用着旧命名(比如 create_users_table.php),但 Schema::create('users', ...) 实际建出的表名变成了 prefix_users——而模型里没配 $table,就去查 users,自然找不到。
- 检查
config/database.php中'prefix' => env('DB_PREFIX', '')是否被意外设为非空值 - 确认所有模型类是否显式声明了
protected $table = 'xxx';没声明的,Laravel 会按类名转蛇形,但前缀一加就错位 - 临时验证:执行
php artisan tinker,输入(new App\Models\User)->getTable(),看返回的是users还是prefix_users
从 Laravel 9 升到 10/11 后,Route::view() 渲染空白页
这不是 Blade 编译问题,而是 Laravel 10 开始默认禁用「视图自动发现」,Route::view('about', 'pages.about') 会尝试加载 resources/views/pages/about.blade.php,但如果路径里有大小写混用(比如实际文件是 About.blade.php),Windows 下能过,Linux 就 404 —— 且不报错,只返回空响应。
- 统一用小写+中划线重命名视图文件:
pages/about.blade.php,别用Pages/About.blade.php - 升级后立刻运行
php artisan view:clear,否则缓存里还是旧路径映射 - 如果用了自定义视图路径(
View::addLocation()),要同步检查该路径下文件名是否符合 Linux 大小写敏感规则
phpunit.xml 里 whitelist 标签失效导致测试覆盖率为空
Laravel 9.3+ 彻底移除了 PHPUnit 原生 <whitelist></whitelist> 支持,改用 <coverage></coverage> + <include></include>。如果你沿用旧配置,php artisan test --coverage 会生成报告,但所有行都标为「未覆盖」,因为根本没把源码目录加入扫描范围。
- 把
<whitelist></whitelist>整个块删掉,换成:<coverage processuncoveredfiles="true"><include><directory suffix=".php">app/</directory></include></coverage>
- 确保
suffix=".php"存在,否则Helper.php或functions.php这类非类文件不会被计入 - 若项目用了多级
app/Modules/结构,需逐个<directory></directory>显式列出,通配符**不生效
升级最麻烦的从来不是改几行代码,而是那些没报错、只悄悄失效的默认行为——比如视图路径解析、覆盖率扫描、甚至数据库连接的超时单位(Laravel 11 把 options 里的 PDO::ATTR_TIMEOUT 改成了秒,之前是毫秒)。留心这些「静默变更」,比死磕语法错误耗时多得多。











