Laravel 11 升级需彻底清理废弃 API 并逐项适配:删除 Kernel.php、Providers 目录及 bootstrap/app.php 中旧逻辑;重写中间件注册、响应构造(必须用 ResponseFactory)、路由绑定(含模型 $keyType 设置)及配置项(如 logging、session),否则导致认证丢失、限流失效或 JSON 结构错乱。

清理 Laravel 11 中已废弃的 API 并完成代码适配,不是删掉报错行就能跑通,必须逐项核对生命周期变更、中间件注册路径、响应构造方式和路由绑定逻辑——漏掉任一环节会导致认证标签丢失、限流静默失效或 JSON 响应结构错乱。
删除废弃文件与目录结构
打开项目根目录,直接删除以下三个路径:【app/Http/Kernel.php】、【app/Providers】(整个文件夹)、【bootstrap/app.php】中已注释掉的旧引导逻辑。
别保留空文件夹或残留注释块——Laravel 11 的服务容器不再扫描 Providers 目录,Kernel.php 文件若存在但未被引用,artisan 命令会跳过加载,导致中间件组失效且无任何提示。
执行 php artisan config:clear 后再运行 php artisan serve,确认启动无 Warning 或 Deprecated 提示。
重写中间件注册逻辑
新建或编辑 bootstrap/app.php,确保它只包含以下最小有效结构:
$app = Illuminate\Foundation\Application::getInstance();
$app->useStoragePath(__DIR__.'/../storage');
$app->withRouting(
web: __DIR__.'/../routes/web.php',
api: __DIR__.'/../routes/api.php',
commands: __DIR__.'/../routes/console.php',
health: '/up'
);
$app->withMiddleware(function (Illuminate\Foundation\Http\Middleware $middleware) {
$middleware->web(append: [
App\Http\Middleware\EncryptCookies::class,
Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
]);
$middleware->api(append: [
Illuminate\Routing\Middleware\SubstituteBindings::class,
]);
});
$app->withExceptions(function (Illuminate\Foundation\Exceptions\Handler $handler) {
return $handler;
});
return $app;
注意:中间件组 web 和 api 必须在 withMiddleware() 中显式声明,否则路由里写 Route::middleware('api') 会报错 Middleware group [api] does not exist。
如果之前在 app/Providers/AppServiceProvider.php 的 boot() 里注册了中间件,现在必须挪到 bootstrap/app.php 的 withMiddleware() 闭包内,且不能依赖 $this->app->singleton() 等旧式绑定。
迁移废弃的响应构造方式
全局搜索项目中所有 Response::json()、response()->json() 后接 withHeaders() 或 withStatus() 的链式调用。
将这类写法统一替换为 ResponseFactory 构造:
方法一:使用 response() 辅助函数 + array_merge
→ response(['data' => $user], 200)
->header('Content-Type', 'application/json')
->header('X-Deprecated', 'true');
方法二:注入 ResponseFactory 到控制器构造函数(推荐用于高频响应场景)
public function __construct(protected ResponseFactory $response) {}
然后在方法中 return $this->response->json(['data' => $user])->status(200)->withHeaders([...]);
⚠️ 关键区别:Laravel 11 不再允许直接 new Response() 或调用静态 Response::json(),所有响应必须经由 ResponseFactory 实例生成,否则 @response 注释无法被文档生成器提取字段。
修正路由与模型绑定行为
第一步:检查 routes/api.php 中所有 Route::apiResource() 定义。
第二步:为每个 apiResource 路由手动追加中间件绑定,例如:
Route::middleware('auth:sanctum')->apiResource('posts', PostController::class);
第三步:打开对应控制器(如 app/Http/Controllers/PostController.php),检查 show() 方法签名:
public function show(Post $post) —— 若数据库主键是 UUID 或字符串类型,必须在 Post 模型中显式设置:
protected $keyType = 'string';
public $incrementing = false;
第四步:验证隐式绑定是否生效——访问 /api/posts/abc,若返回 404 而非模型实例,说明 $keyType 未生效或数据库字段类型不匹配(如 MySQL 中该字段是 VARCHAR 但未设为 utf8mb4_bin 排序规则)。
第五步:删除 routes/web.php 中所有以 /api/ 开头的路由定义,Laravel 11 不再支持 web 中间件组自动处理 API 请求,混用会导致 session 冲突和 CSRF 验证失败。
更新配置项与废弃 API 映射
打开 config/logging.php,移除 'stack' => ['channels' => ['stderr']] 这一行,默认 stack 驱动不再包含 stderr 输出。
打开 config/session.php,若文件不存在则从 Laravel 11 官方仓库复制一份标准模板覆盖,重点确认 driver 配置项值为 redis 或 database,file 驱动在 API 场景下已被弃用。
在 config/api.php 中新增废弃路由映射:
'deprecated_routes' => [
'v1.users.index' => [
'since' => '2026-01-01',
'replacement' => 'api.v2.users.index'
],
],
然后在对应控制器方法顶部插入判断逻辑:
if (config('api.deprecated_routes')['v1.users.index'] ?? false) {
return response()->json(['message' => 'API v1 is deprecated'])->header('Warning', '299 - "API v1 is deprecated; use v2 instead"');
}


















