Laravel 11 新特性全面解析:简化应用结构与现代化开发体验
Orion K Lv6

前言

Laravel 11 于2024年3月正式发布,这是一个具有重大改进的版本。3 本文将深入解析Laravel 11的核心新特性,帮助开发者了解这个现代化框架的最新发展。

PHP 8.2 最低版本要求

Laravel 11要求最低PHP版本为8.2,这延续了Laravel跟随PHP最新版本的策略。2 虽然这可能会限制一些项目的升级,但也确保了框架能够利用PHP的最新特性。

1
2
3
4
5
6
7
8
9
// PHP 8.2 新特性示例:只读类
readonly class UserConfiguration
{
public function __construct(
public string $name,
public string $email,
public array $preferences
) {}
}

简化的应用程序结构

重新设计的 bootstrap/app.php

Laravel 11最显著的变化是引入了简化的应用程序结构。3 新的bootstrap/app.php文件成为了代码优先的应用程序配置中心:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?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',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
// 自定义中间件配置
$middleware->validateCsrfTokens(
except: ['stripe/*', 'webhook/*']
);

$middleware->web(append: [
\App\Http\Middleware\EnsureUserIsSubscribed::class,
]);
})
->withExceptions(function (Exceptions $exceptions) {
// 异常处理配置
$exceptions->render(function (\Throwable $e) {
// 自定义异常渲染逻辑
});
})->create();

服务提供者的简化

Laravel 11将原本的5个默认服务提供者简化为1个AppServiceProvider3 这大大简化了应用程序的结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Gate;

class AppServiceProvider extends ServiceProvider
{
/**
* 注册应用服务
*/
public function register(): void
{
// 服务注册逻辑
}

/**
* 启动应用服务
*/
public function boot(): void
{
// 原本在AuthServiceProvider中的授权逻辑
Gate::define('update-post', function ($user, $post) {
return $user->id === $post->user_id;
});

// 事件监听器注册(现在默认启用事件发现)
}
}

中间件架构的改进

Laravel 11将中间件移动到框架核心,移除了app/Http/Middleware目录和app/Http/Kernel.php文件。2 中间件配置现在在bootstrap/app.php中进行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
->withMiddleware(function (Middleware $middleware) {
// CSRF令牌验证配置
$middleware->validateCsrfTokens(
except: ['stripe/*', 'api/webhooks/*']
);

// 添加自定义中间件到web组
$middleware->web(append: [
\App\Http\Middleware\TrackUserActivity::class,
]);

// 添加自定义中间件到api组
$middleware->api(prepend: [
\App\Http\Middleware\ApiRateLimit::class,
]);

// 全局中间件
$middleware->append(\App\Http\Middleware\SecurityHeaders::class);
})

Laravel Reverb:WebSocket支持

Laravel 11引入了官方的WebSocket服务器Laravel Reverb,为应用程序提供实时功能支持。1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 安装Laravel Reverb
// composer require laravel/reverb

// 配置WebSocket事件
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class MessageSent implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;

public function __construct(
public string $message,
public int $userId
) {}

public function broadcastOn(): array
{
return [
new PrivateChannel('chat.' . $this->userId),
];
}
}

每秒速率限制

Laravel 11支持更精细的速率限制,可以按秒进行限制。2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 在AppServiceProvider中配置
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;

public function boot(): void
{
RateLimiter::for('api', function (Request $request) {
return Limit::perSecond(10)->by($request->user()?->id ?: $request->ip());
});

RateLimiter::for('uploads', function (Request $request) {
return Limit::perSecond(2)->by($request->user()->id);
});
}

健康检查路由

Laravel 11内置了健康检查路由/up,方便与Kubernetes等容器编排工具集成。2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 在bootstrap/app.php中配置
->withRouting(
web: __DIR__.'/../routes/web.php',
health: '/up', // 健康检查路由
)

// 自定义健康检查逻辑
use Illuminate\Foundation\Events\DiagnosingHealth;
use Illuminate\Support\Facades\Event;

Event::listen(DiagnosingHealth::class, function () {
// 检查数据库连接
\DB::connection()->getPdo();

// 检查缓存
\Cache::put('health-check', 'ok', 60);

// 检查队列
// 其他健康检查逻辑
});

加密密钥轮换

Laravel 11支持优雅的加密密钥轮换,通过APP_PREVIOUS_KEYS环境变量支持多个历史密钥。2

1
2
3
# .env文件配置
APP_KEY=base64:new_encryption_key_here
APP_PREVIOUS_KEYS=base64:old_key_1,base64:old_key_2
1
2
3
4
5
6
// Laravel会自动处理密钥轮换
// 加密时使用APP_KEY
// 解密时先尝试APP_KEY,失败则尝试APP_PREVIOUS_KEYS中的密钥

$encrypted = encrypt('sensitive data');
$decrypted = decrypt($encrypted); // 自动处理密钥轮换

队列测试改进

Laravel 11改进了队列交互测试,提供更好的测试体验:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class JobTest extends TestCase
{
use RefreshDatabase;

public function test_job_processing(): void
{
// 模拟队列
Queue::fake();

// 触发任务
ProcessPayment::dispatch($payment);

// 断言任务被推送
Queue::assertPushed(ProcessPayment::class);

// 断言任务参数
Queue::assertPushed(ProcessPayment::class, function ($job) use ($payment) {
return $job->payment->id === $payment->id;
});
}
}

新的Artisan命令

Laravel 11引入了新的Artisan命令来简化开发流程:

1
2
3
4
5
6
7
8
9
10
11
# 安装API路由
php artisan install:api

# 安装广播功能
php artisan install:broadcasting

# 创建类型转换器
php artisan make:cast UserPreferences

# 创建枚举
php artisan make:enum UserStatus

数据库改进

默认SQLite数据库

Laravel 11默认使用SQLite作为数据库,这提供了更轻量级的开发体验:2

1
2
3
4
5
6
7
8
9
10
11
12
13
// config/database.php
'default' => env('DB_CONNECTION', 'sqlite'),

'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'url' => env('DATABASE_URL'),
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
],
// ...
],

改进的模型转换

Laravel 11改进了属性转换功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Casts\Attribute;

class User extends Model
{
protected $fillable = ['name', 'email', 'preferences'];

protected function casts(): array
{
return [
'email_verified_at' => 'datetime',
'preferences' => 'array',
'created_at' => 'datetime:Y-m-d H:i:s',
];
}

// 新的属性访问器语法
protected function fullName(): Attribute
{
return Attribute::make(
get: fn (mixed $value, array $attributes) =>
$attributes['first_name'] . ' ' . $attributes['last_name'],
);
}
}

升级建议

升级前的准备

  1. PHP版本检查:确保服务器支持PHP 8.2+
  2. 依赖检查:检查第三方包的Laravel 11兼容性
  3. 测试覆盖:确保有充分的测试覆盖

升级步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1. 更新composer.json
composer require laravel/framework:^11.0

# 2. 更新依赖
composer update

# 3. 发布新的配置文件
php artisan config:publish

# 4. 运行迁移
php artisan migrate

# 5. 清除缓存
php artisan config:clear
php artisan cache:clear
php artisan view:clear

总结

Laravel 11带来了显著的架构简化和现代化改进。1 主要亮点包括:

  • 简化的应用结构:减少了样板代码,提高了开发效率
  • 现代化的PHP支持:充分利用PHP 8.2的新特性
  • 实时功能支持:内置WebSocket服务器Laravel Reverb
  • 改进的开发体验:更好的测试工具和调试功能

虽然升级需要一定的工作量,但Laravel 11的改进将为长期开发带来显著的效率提升。建议开发团队在充分测试的基础上,逐步迁移到这个现代化的框架版本。

本站由 提供部署服务