Composer 安装与新版骨架解析
High Contrast
Dark Mode
Light Mode
Sepia
Forest
1 min read267 words

Composer 安装与新版骨架解析

Laravel 11 彻底精简了骨架结构——原来 Laravel 8/9 里密密麻麻的 app/Http/Kernel.phpapp/Providers/ 目录里的 5 个文件,在 Laravel 11 中被大幅合并和隐藏。如果你按旧教程的目录结构找文件,你会发现很多都找不到了。本节从安装开始,把新旧差异讲清楚。


环境要求

组件 最低版本 推荐
PHP 8.2 8.3
Composer 2.x 2.7+
Node.js 20.x(可选,前端资产编译用) 22 LTS
数据库 PostgreSQL 15+ / MySQL 8.0+ PostgreSQL 16
# 验证环境
php --version   # PHP 8.3.x
composer --version   # Composer 2.7.x
# 安装 Laravel Installer(推荐)
composer global require laravel/installer
# 或者用 Composer create-project
composer create-project laravel/laravel taskflow
# 用 Laravel Installer(更快)
laravel new taskflow
# 会交互式询问:
#   - Starter kit? None(我们手动配置)
#   - Database? PostgreSQL
#   - Run migrations? Yes

Laravel 11 骨架:新旧对比

Laravel 10 骨架(旧):                Laravel 11 骨架(新):
app/
├── Console/                           app/
│   └── Kernel.php          ───→       ├── Console/        ← 消失了!
├── Exceptions/                        ├── Exceptions/
│   └── Handler.php         ───→       │   └── Handler.php  ← 大幅精简
├── Http/
│   ├── Controllers/                   ├── Http/
│   ├── Kernel.php          ───→       │   ├── Controllers/
│   └── Middleware/         ───→       │   └── Middleware/  ← 只剩自定义的
├── Models/                            ├── Models/
└── Providers/                         └── Providers/
├── AppServiceProvider.php  ──→        └── AppServiceProvider.php ← 只剩这一个
├── AuthServiceProvider.php ───→       (其他 Provider 消失了)
├── BroadcastServiceProvider.php
├── EventServiceProvider.php
└── RouteServiceProvider.php
bootstrap/
└── app.php                ──→  bootstrap/app.php  ← 这是新的"核心配置"
routes/
├── web.php                            routes/
├── api.php                ──→         ├── web.php
├── channels.php                       └── console.php  ← api.php 默认不存在
└── console.php                        (按需创建 api.php / channels.php)

bootstrap/app.php:新的核心配置

Laravel 11 把原来分散在 Kernel.php、各种 ServiceProvider 中的配置,统一收纳到 bootstrap/app.php

<?php
// bootstrap/app.php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
api: __DIR__.'/../routes/api.php',   // 需要时手动添加
commands: __DIR__.'/../routes/console.php',
channels: __DIR__.'/../routes/channels.php',  // Broadcasting 时添加
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
// 全局中间件配置(原来在 Kernel.php)
$middleware->web(append: [
\App\Http\Middleware\HandleInertiaRequests::class,  // 按需添加
]);
// API 中间件组
$middleware->api(prepend: [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
]);
// 中间件别名(原来在 Kernel.php $routeMiddleware)
$middleware->alias([
'role' => \Spatie\Permission\Middleware\RoleMiddleware::class,
]);
})
->withExceptions(function (Exceptions $exceptions) {
// 异常处理(原来在 Handler.php 的 register() 方法)
$exceptions->report(function (\App\Exceptions\PaymentException $e) {
logger()->critical('Payment failed', ['error' => $e->getMessage()]);
});
$exceptions->render(function (\App\Exceptions\PaymentException $e) {
return response()->json(['error' => $e->getMessage()], 422);
});
})->create();

目录结构详解

taskflow/
├── app/
│   ├── Http/
│   │   ├── Controllers/          ← 控制器
│   │   └── Middleware/           ← 自定义中间件
│   ├── Models/                   ← Eloquent 模型
│   ├── Providers/
│   │   └── AppServiceProvider.php  ← 服务绑定、宏定义
│   └── (你自己建的目录:Services/, Actions/, DTOs/ 等)
├── bootstrap/
│   ├── app.php                   ← 应用核心配置(Laravel 11 新增)
│   └── cache/                    ← 启动缓存(不要手动修改)
├── config/                       ← 各模块配置文件
│   ├── app.php
│   ├── database.php
│   ├── queue.php
│   └── ...
├── database/
│   ├── factories/                ← 测试数据工厂
│   ├── migrations/               ← 数据库迁移
│   └── seeders/                  ← 数据填充
├── public/                       ← Web 根目录(Nginx 指向这里)
│   └── index.php                 ← 入口文件
├── resources/
│   ├── views/                    ← Blade 模板
│   └── js/ css/                  ← 前端资产
├── routes/
│   ├── web.php                   ← Web 路由
│   └── console.php               ← Artisan 命令定义
├── storage/                      ← 日志、缓存、上传文件
├── tests/
│   ├── Feature/                  ← 集成测试
│   └── Unit/                     ← 单元测试
├── .env                          ← 环境变量(不提交到 Git)
├── .env.example                  ← 环境变量模板(提交到 Git)
├── artisan                       ← CLI 入口
└── composer.json

第一个 Artisan 命令

# 查看所有可用命令
php artisan list
# 启动开发服务器(PHP built-in server)
php artisan serve
# → http://localhost:8000
# 生成应用密钥(安装后必须执行)
php artisan key:generate
# 数据库迁移
php artisan migrate
# 清空所有缓存(开发时常用)
php artisan optimize:clear
# 查看路由列表
php artisan route:list
php artisan route:list --path=api  # 只看 /api 路由

TaskFlow 项目初始化

# 创建项目
laravel new taskflow
# 配置 .env
cd taskflow
cp .env.example .env
# 编辑 .env(数据库配置)
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=taskflow
DB_USERNAME=postgres
DB_PASSWORD=your_password
# 创建数据库(PostgreSQL)
psql -U postgres -c "CREATE DATABASE taskflow;"
# 运行迁移(包含默认的 users 表等)
php artisan migrate
# 验证
php artisan serve
# 访问 http://localhost:8000 看到 Laravel 欢迎页 ✅

下一节服务容器与服务提供者——Laravel 的核心是 IoC 容器,理解它才能真正理解为什么 new Controller() 可以自动注入依赖,以及如何绑定自定义服务。