升级指南 
高影响变更 
中等影响变更 
低影响变更 
从 9.x 升级到 10.0 
预计升级时间:10 分钟 
NOTE
我们尝试记录每一个可能的重大变更。由于这些变更中的一些位于框架的偏僻部分,只有一部分变更可能实际影响您的应用程序。想节省时间?您可以使用 Laravel Shift 来帮助自动化您的应用程序升级。
更新依赖项 
影响可能性:高
需要 PHP 8.1.0 
Laravel 现在需要 PHP 8.1.0 或更高版本。
需要 Composer 2.2.0 
Laravel 现在需要 Composer 2.2.0 或更高版本。
Composer 依赖项 
您应该在应用程序的 composer.json 文件中更新以下依赖项:
- laravel/framework到- ^10.0
- laravel/sanctum到- ^3.2
- doctrine/dbal到- ^3.0
- spatie/laravel-ignition到- ^2.0
- laravel/passport到- ^11.0(升级指南)
- laravel/ui到- ^4.0
如果您从 Sanctum 2.x 升级到 3.x,请查阅 Sanctum 升级指南。
此外,如果您希望使用 PHPUnit 10,您应该从应用程序的 phpunit.xml 配置文件的 <coverage> 部分中删除 processUncoveredFiles 属性。然后,在应用程序的 composer.json 文件中更新以下依赖项:
- nunomaduro/collision到- ^7.0
- phpunit/phpunit到- ^10.0
最后,检查应用程序使用的任何其他第三方包,并验证您使用的是支持 Laravel 10 的正确版本。
最低稳定性 
您应该在应用程序的 composer.json 文件中将 minimum-stability 设置更新为 stable。或者,由于 minimum-stability 的默认值是 stable,您可以从应用程序的 composer.json 文件中删除此设置:
"minimum-stability": "stable",应用程序 
公共路径绑定 
影响可能性:低
如果您的应用程序通过将 path.public 绑定到容器来自定义其“公共路径”,您应该更新代码以调用 Illuminate\Foundation\Application 对象提供的 usePublicPath 方法:
app()->usePublicPath(__DIR__.'/public');授权 
registerPolicies 方法 
影响可能性:低
AuthServiceProvider 的 registerPolicies 方法现在由框架自动调用。因此,您可以从应用程序的 AuthServiceProvider 的 boot 方法中删除对此方法的调用。
缓存 
Redis 缓存标签 
影响可能性:中等
Cache::tags() 的使用仅推荐在使用 Memcached 的应用中。如果你的应用使用 Redis 作为缓存驱动,你应该考虑迁移到 Memcached,或者将应用升级到 Laravel 12.30.0。
数据库 
数据库表达式 
影响可能性:中等
Laravel 10.x 中的数据库“表达式”(通常通过 DB::raw 生成)已被重写,以便将来提供更多功能。特别是,语法的原始字符串值现在必须通过表达式的 getValue(Grammar $grammar) 方法检索。不再支持使用 (string) 将表达式转换为字符串。
通常,这不会影响最终用户应用程序;但是,如果您的应用程序手动将数据库表达式转换为字符串使用 (string) 或直接调用表达式的 __toString 方法,您应该更新代码以调用 getValue 方法:
use Illuminate\Support\Facades\DB;
$expression = DB::raw('select 1');
$string = $expression->getValue(DB::connection()->getQueryGrammar());查询异常构造函数 
影响可能性:非常低
Illuminate\Database\QueryException 构造函数现在接受一个字符串连接名称作为其第一个参数。如果您的应用程序手动抛出此异常,您应该相应地调整代码。
ULID 列 
影响可能性:低
当迁移调用 ulid 方法而不带任何参数时,列现在将被命名为 ulid。在 Laravel 的早期版本中,调用此方法而不带任何参数会创建一个错误命名为 uuid 的列:
$table->ulid();要在调用 ulid 方法时显式指定列名,您可以将列名传递给该方法:
$table->ulid('ulid');Eloquent 
模型 "Dates" 属性 
影响可能性:中等
Eloquent 模型的已弃用 $dates 属性已被移除。您的应用程序现在应该使用 $casts 属性:
protected $casts = [
    'deployed_at' => 'datetime',
];本地化 
语言目录 
影响可能性:无
虽然与现有应用程序无关,但 Laravel 应用程序骨架默认不再包含 lang 目录。相反,在编写新的 Laravel 应用程序时,可以使用 lang:publish Artisan 命令发布:
php artisan lang:publish日志记录 
Monolog 3 
影响可能性:中等
Laravel 的 Monolog 依赖项已更新为 Monolog 3.x。如果您在应用程序中直接与 Monolog 交互,您应该查看 Monolog 的 升级指南。
如果您使用第三方日志服务,如 BugSnag 或 Rollbar,您可能需要将这些第三方包升级到支持 Monolog 3.x 和 Laravel 10.x 的版本。
队列 
Bus::dispatchNow 方法 
影响可能性:低
已弃用的 Bus::dispatchNow 和 dispatch_now 方法已被移除。相应地,您的应用程序应该使用 Bus::dispatchSync 和 dispatch_sync 方法。
dispatch() 助手返回值 
调用不实现 Illuminate\Contracts\Queue 的类的 dispatch 以前会返回类的 handle 方法的结果。然而,现在将返回一个 Illuminate\Foundation\Bus\PendingBatch 实例。您可以使用 dispatch_sync() 来复制以前的行为。
路由 
中间件别名 
影响可能性:可选
在新的 Laravel 应用程序中,App\Http\Kernel 类的 $routeMiddleware 属性已重命名为 $middlewareAliases 以更好地反映其用途。您可以在现有应用程序中重命名此属性,但这不是必需的。
速率限制器返回值 
影响可能性:低
调用 RateLimiter::attempt 方法时,提供的闭包返回的值现在将由该方法返回。如果没有返回任何内容或返回 null,attempt 方法将返回 true:
$value = RateLimiter::attempt('key', 10, fn () => ['example'], 1);
$value; // ['example']Redirect::home 方法 
影响可能性:非常低
已弃用的 Redirect::home 方法已被移除。相应地,您的应用程序应该重定向到一个显式命名的路由:
return Redirect::route('home');测试 
服务模拟 
影响可能性:中等
已弃用的 MocksApplicationServices trait 已从框架中移除。此 trait 提供了测试方法,如 expectsEvents、expectsJobs 和 expectsNotifications。
如果您的应用程序使用这些方法,我们建议您过渡到 Event::fake、Bus::fake 和 Notification::fake。您可以在尝试模拟的组件的相应文档中了解有关通过伪造进行模拟的更多信息。
验证 
闭包验证规则消息 
影响可能性:非常低
在编写基于闭包的自定义验证规则时,多次调用 $fail 回调现在将消息附加到数组中,而不是覆盖先前的消息。通常,这不会影响您的应用程序。
此外,$fail 回调现在返回一个对象。如果您以前为验证闭包的返回类型进行类型提示,这可能需要您更新类型提示:
public function rules()
{
    'name' => [
        function ($attribute, $value, $fail) {
            $fail('validation.translation.key')->translate();
        },
    ],
}验证消息和闭包规则 
影响可能性:非常低
以前,您可以通过向闭包验证规则中注入的 $fail 回调提供一个数组来将失败消息分配给不同的键。然而,您现在应该将键作为第一个参数提供,并将失败消息作为第二个参数:
Validator::make([
    'foo' => 'string',
    'bar' => [function ($attribute, $value, $fail) {
        $fail('foo', 'Something went wrong!');
    }],
]);表单请求 After 方法 
影响可能性:非常低
在表单请求中,after 方法现在由 Laravel 保留。如果您的表单请求定义了一个 after 方法,该方法应重命名或修改以利用 Laravel 表单请求的新“验证后”功能。
杂项 
我们还鼓励您查看 laravel/laravel GitHub 仓库 中的更改。虽然许多这些更改不是必需的,但您可能希望将这些文件与您的应用程序保持同步。本升级指南将涵盖其中一些更改,但其他更改,如配置文件或注释的更改,将不会。
您可以使用 GitHub 比较工具 轻松查看更改,并选择哪些更新对您重要。然而,GitHub 比较工具显示的许多更改是由于我们组织采用了 PHP 原生类型。这些更改是向后兼容的,并且在迁移到 Laravel 10 时采用它们是可选的。