前言
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
| 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个AppServiceProvider。3 这大大简化了应用程序的结构:
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 { 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) { $middleware->validateCsrfTokens( except: ['stripe/*', 'api/webhooks/*'] ); $middleware->web(append: [ \App\Http\Middleware\TrackUserActivity::class, ]); $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
|
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
| 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
| ->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
| APP_KEY=base64:new_encryption_key_here APP_PREVIOUS_KEYS=base64:old_key_1,base64:old_key_2
|
1 2 3 4 5 6
|
$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
| 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
| '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'], ); } }
|
升级建议
升级前的准备
- PHP版本检查:确保服务器支持PHP 8.2+
- 依赖检查:检查第三方包的Laravel 11兼容性
- 测试覆盖:确保有充分的测试覆盖
升级步骤
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| composer require laravel/framework:^11.0
composer update
php artisan config:publish
php artisan migrate
php artisan config:clear php artisan cache:clear php artisan view:clear
|
总结
Laravel 11带来了显著的架构简化和现代化改进。1 主要亮点包括:
- 简化的应用结构:减少了样板代码,提高了开发效率
- 现代化的PHP支持:充分利用PHP 8.2的新特性
- 实时功能支持:内置WebSocket服务器Laravel Reverb
- 改进的开发体验:更好的测试工具和调试功能
虽然升级需要一定的工作量,但Laravel 11的改进将为长期开发带来显著的效率提升。建议开发团队在充分测试的基础上,逐步迁移到这个现代化的框架版本。