Laravel 12 生态系统:从扩展包到微服务
摘要
本文探索 Laravel 12 的生态系统,包括官方扩展包(如 Sanctum、Passport、Horizon)的使用,以及与第三方服务的集成。同时,讨论 Laravel 在微服务架构中的应用,如 Laravel Octane 的性能优化、API 网关的构建,帮助开发者构建完整的 Laravel 技术栈。
1. Laravel 生态系统概述
Laravel 12 拥有一个丰富的生态系统,从官方扩展包到社区贡献的组件,为开发者提供了全面的工具集。
1.1 核心生态组件
- 官方扩展包:Sanctum、Passport、Horizon、Telescope、Dusk 等
- 社区扩展包:Spatie、Laravel-Excel、Laravel-ide-helper 等
- 前端集成:Laravel Mix、Vite、Livewire、Inertia.js
- 开发工具:Laravel Valet、Laravel Homestead、Laravel Sail
- 云服务:Laravel Vapor、Laravel Forge
- 数据库工具:Laravel Scout、Laravel Cashier
1.2 生态系统的价值
- 加速开发:现成的组件和工具减少重复开发
- 提高质量:经过验证的扩展包保证代码质量
- 降低成本:开源组件减少开发和维护成本
- 社区支持:活跃的社区提供技术支持和解决方案
2. 官方扩展包使用
Laravel 12 提供了多个官方扩展包,解决常见的开发问题。
2.1 Laravel Sanctum
Sanctum 提供了轻量级的 API 认证解决方案,适用于 SPA 和移动应用。
安装与配置
1 2 3
| composer require laravel/sanctum php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider" php artisan migrate
|
基本使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
return [ 'paths' => ['api/*', 'sanctum/csrf-cookie'], 'allowed_methods' => ['*'], 'allowed_origins' => ['*'], 'allowed_origins_patterns' => [], 'allowed_headers' => ['*'], 'exposed_headers' => [], 'max_age' => 0, 'supports_credentials' => true, ];
Route::middleware('auth:sanctum')->get('/user', function (Request $request) { return $request->user(); });
$user = User::find(1); $token = $user->createToken('token-name')->plainTextToken;
|
2.2 Laravel Passport
Passport 提供了完整的 OAuth2 服务器实现,适用于需要更复杂认证的应用。
安装与配置
1 2 3 4
| composer require laravel/passport php artisan vendor:publish --provider="Laravel\Passport\PassportServiceProvider" php artisan migrate php artisan passport:install
|
基本使用
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
| use Laravel\Passport\HasApiTokens;
class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; }
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'passport', 'provider' => 'users', 'hash' => false, ], ],
Route::middleware('auth:api')->get('/user', function (Request $request) { return $request->user(); });
|
2.3 Laravel Horizon
Horizon 提供了队列监控和管理的仪表板,是处理后台任务的必备工具。
安装与配置
1 2 3
| composer require laravel/horizon php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider" php artisan migrate
|
基本使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => env('REDIS_QUEUE', 'default'), 'retry_after' => 90, 'block_for' => null, ],
php artisan horizon
|
2.4 Laravel Telescope
Telescope 提供了调试助手,监控请求、队列、数据库查询等。
安装与配置
1 2 3
| composer require laravel/telescope --dev php artisan vendor:publish --provider="Laravel\Telescope\TelescopeServiceProvider" php artisan migrate
|
基本使用
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
|
'watchers' => [ Watchers\CacheWatcher::class => true, Watchers\CommandWatcher::class => true, Watchers\DumpWatcher::class => true, Watchers\EventWatcher::class => true, Watchers\ExceptionWatcher::class => true, Watchers\JobWatcher::class => true, Watchers\LogWatcher::class => true, Watchers\MailWatcher::class => true, Watchers\ModelWatcher::class => true, Watchers\NotificationWatcher::class => true, Watchers\QueryWatcher::class => [ 'enabled' => true, 'slow' => 100, ], Watchers\RedisWatcher::class => true, Watchers\RequestWatcher::class => [ 'enabled' => true, 'size_limit' => 64, ], Watchers\ScheduleWatcher::class => true, ],
|
3. 社区扩展包使用
社区提供了大量高质量的扩展包,解决各种开发问题。
3.1 Spatie 包
Spatie 是 Laravel 社区最活跃的贡献者之一,提供了许多实用的扩展包。
Laravel Permission
1 2 3
| composer require spatie/laravel-permission php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" php artisan migrate
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable { use HasRoles; }
Role::create(['name' => 'admin']); Permission::create(['name' => 'edit articles']);
$role->givePermissionTo('edit articles'); $user->assignRole('admin');
if ($user->can('edit articles')) { }
|
1 2 3
| composer require spatie/laravel-medialibrary php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider" php artisan migrate
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\InteractsWithMedia;
class Product extends Model implements HasMedia { use InteractsWithMedia; }
$product->addMedia($request->file('image'))->toMediaCollection('images');
$url = $product->getFirstMediaUrl('images', 'thumb');
|
3.2 其他常用扩展包
Laravel Excel
1
| composer require maatwebsite/excel
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| use Maatwebsite\Excel\Concerns\FromCollection;
class UsersExport implements FromCollection { public function collection() { return User::all(); } }
public function export() { return Excel::download(new UsersExport, 'users.xlsx'); }
|
Laravel IDE Helper
1
| composer require --dev barryvdh/laravel-ide-helper
|
1 2 3 4
| php artisan ide-helper:generate php artisan ide-helper:models php artisan ide-helper:meta
|
4. 前端集成
Laravel 12 提供了多种前端集成方案,从传统的 Mix 到现代的 Vite。
4.1 Vite 集成
Vite 是 Laravel 12 默认的前端构建工具,提供了更快的开发体验。
基本配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import { defineConfig } from 'vite'; import laravel from 'laravel-vite-plugin';
export default defineConfig({ plugins: [ laravel({ input: [ 'resources/css/app.css', 'resources/js/app.js', ], refresh: true, }), ], });
|
使用示例
1 2 3 4 5 6 7 8 9 10 11 12 13
| <!DOCTYPE html> <html> <head> @vite('resources/css/app.css') </head> <body> <div id="app"> </div> @vite('resources/js/app.js') </body> </html>
|
4.2 Livewire
Livewire 提供了全栈框架体验,无需编写 JavaScript 即可构建交互式界面。
安装与配置
1
| composer require livewire/livewire
|
基本使用
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
| php artisan make:livewire counter
class Counter extends Component { public $count = 0; public function increment() { $this->count++; } public function render() { return view('livewire.counter'); } }
<div> <h1>{{ $count }}</h1> <button wire:click="increment">Increment</button> </div>
@livewire('counter')
|
4.3 Inertia.js
Inertia.js 允许使用现代前端框架(如 Vue、React)构建单页应用,同时保持 Laravel 的路由系统。
安装与配置
1 2
| composer require inertiajs/inertia-laravel npm install @inertiajs/inertia @inertiajs/inertia-vue3
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| php artisan inertia:middleware
protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\HandleInertiaRequests::class, ], ];
<!DOCTYPE html> <html> <head> @inertiaHead </head> <body> @inertia </body> </html>
|
基本使用
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 31 32
| use Inertia\Inertia;
class UserController extends Controller { public function index() { return Inertia::render('Users/Index', [ 'users' => User::all(), ]); } }
<template> <div> <h1>Users</h1> <ul> <li v-for="user in users" :key="user.id"> {{ user.name }} </li> </ul> </div> </template>
<script setup> import { ref, onMounted } from 'vue'; import { usePage } from '@inertiajs/inertia-vue3';
const { users } = usePage().props; </script>
|
5. 开发工具
Laravel 12 提供了多种开发工具,简化本地开发环境的搭建。
5.1 Laravel Sail
Sail 提供了基于 Docker 的开发环境,适用于所有操作系统。
安装与配置
1 2 3
| composer require laravel/sail --dev php artisan sail:install ./vendor/bin/sail up
|
基本使用
1 2 3 4 5 6 7 8 9 10 11
| ./vendor/bin/sail artisan migrate
./vendor/bin/sail composer require package
./vendor/bin/sail npm install
./vendor/bin/sail down
|
5.2 Laravel Valet
Valet 提供了轻量级的本地开发环境,适用于 macOS。
安装与配置
1 2 3 4
| composer global require laravel/valet valet install cd your-project valet link
|
基本使用
1 2 3 4 5 6 7 8
| valet sites
valet share
valet stop
|
6. 云服务集成
Laravel 12 提供了与云服务的无缝集成,简化部署和运维。
6.1 Laravel Vapor
Vapor 是 Laravel 的无服务器部署平台,运行在 AWS Lambda 上。
安装与配置
1 2 3
| composer require laravel/vapor-cli vapor login vapor init
|
基本使用
1 2 3 4 5 6 7 8
| vapor deploy production
vapor deployments
vapor environments
|
6.2 Laravel Forge
Forge 是 Laravel 的服务器管理平台,自动化部署和配置。
基本使用
- 创建服务器
- 连接 GitHub/GitLab
- 配置站点
- 部署应用
- 监控服务器
7. Laravel 在微服务架构中的应用
Laravel 12 可以在微服务架构中发挥重要作用,提供 API 服务和业务逻辑。
7.1 Laravel Octane
Octane 提供了高性能的应用服务器,基于 Swoole 或 RoadRunner,显著提高 Laravel 应用的性能。
安装与配置
1 2 3 4 5 6 7
| composer require laravel/octane
pecl install swoole
./vendor/bin/rr get
|
基本使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| php artisan octane:start
return [ 'engine' => env('OCTANE_ENGINE', 'swoole'), 'listen' => env('OCTANE_LISTEN', '127.0.0.1:8000'), 'workers' => env('OCTANE_WORKERS', 4), 'task_workers' => env('OCTANE_TASK_WORKERS', 4), 'max_requests' => env('OCTANE_MAX_REQUESTS', 1000), 'tls' => [ 'enabled' => env('OCTANE_TLS_ENABLED', false), 'cert' => env('OCTANE_TLS_CERT', ''), 'key' => env('OCTANE_TLS_KEY', ''), ], ];
|
性能对比
| 场景 | 传统 PHP-FPM | Laravel Octane | 性能提升 |
|---|
| 简单请求 | 500 QPS | 5000 QPS | 10x |
| 复杂请求 | 200 QPS | 2000 QPS | 10x |
| 内存使用 | 100MB/进程 | 50MB/进程 | 50% 减少 |
7.2 API 网关构建
使用 Laravel 构建 API 网关,统一管理微服务的请求路由和认证。
基本架构
1 2 3 4 5 6 7 8 9
| ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 客户端 │ → → │ API 网关 │ → → │ 微服务 A │ └─────────────┘ └─────────────┘ └─────────────┘ ↑ ↑ ↑ ↑ │ │ │ │ ↓ ↓ ↓ ↓ ┌─────────────┐ ┌─────────────┐ │ 认证服务 │ │ 微服务 B │ └─────────────┘ └─────────────┘
|
实现示例
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 31 32 33 34 35 36 37 38 39 40
| Route::middleware('auth:sanctum')->group(function () { Route::prefix('users')->group(function () { Route::get('/', [ApiGatewayController::class, 'proxy'])->defaults('service', 'user-service'); Route::get('/{id}', [ApiGatewayController::class, 'proxy'])->defaults('service', 'user-service'); Route::post('/', [ApiGatewayController::class, 'proxy'])->defaults('service', 'user-service'); Route::put('/{id}', [ApiGatewayController::class, 'proxy'])->defaults('service', 'user-service'); Route::delete('/{id}', [ApiGatewayController::class, 'proxy'])->defaults('service', 'user-service'); }); Route::prefix('products')->group(function () { Route::get('/', [ApiGatewayController::class, 'proxy'])->defaults('service', 'product-service'); Route::get('/{id}', [ApiGatewayController::class, 'proxy'])->defaults('service', 'product-service'); }); });
class ApiGatewayController extends Controller { public function proxy(Request $request) { $service = $request->route()->defaults('service'); $path = $request->path(); $method = $request->method(); $data = $request->all(); $serviceUrl = config("services.{$service}.url"); $response = Http::withHeaders([ 'Authorization' => $request->header('Authorization'), ])->{$method}($serviceUrl . '/' . $path, $data); return response($response->body(), $response->status()) ->withHeaders($response->headers()->all()); } }
|
7.3 服务间通信
使用 Redis 实现服务间通信
1 2 3 4 5 6 7 8 9 10 11
| Redis::publish('user-created', json_encode([ 'user_id' => $user->id, 'email' => $user->email, ]));
Redis::subscribe(['user-created'], function ($message) { $data = json_decode($message, true); });
|
使用 gRPC 实现高性能通信
1
| composer require spiral/roadrunner-grpc
|
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 31
| syntax = "proto3";
package user;
service UserService { rpc GetUser(GetUserRequest) returns (GetUserResponse); rpc CreateUser(CreateUserRequest) returns (CreateUserResponse); }
message GetUserRequest { int32 id = 1; }
message GetUserResponse { int32 id = 1; string name = 2; string email = 3; }
message CreateUserRequest { string name = 1; string email = 2; string password = 3; }
message CreateUserResponse { int32 id = 1; string name = 2; string email = 3; }
|
8. 自定义扩展包开发
Laravel 12 提供了创建自定义扩展包的工具,允许开发者封装和共享功能。
8.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 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| your-package/ ├── src/ │ ├── YourPackageServiceProvider.php │ ├── Commands/ │ ├── Http/ │ ├── Models/ │ └── ... ├── config/ ├── resources/ ├── database/ ├── tests/ ├── tests/ ├── resources/ ├── README.md ├── CHANGELOG.md ├── README.md ├── tests/ ├── routes/ ├── database/ ├── tests/ ├── src/ README.md ├── composer.json ├── README.md ├── composer.json ├── phpunit.xml.dist ├── .gitignore ├── README.md ├── README.md ├── LICENSE ├── README.md ├── tests/ ├── resources/ ├── src/ ├── README.md ├── composer.json ├── phpunit.xml.dist ├── tests/ ├── vendor/ ├── composer.json ├── README.md └── composer.json
|
resources/
├── database/
├── public/
├── tests/
├── README.md
├── CHANGELOG.md
├── LICENSE.md
├── README.md
├── composer.json
├── phpunit.xml.dist
├── src/
├── vendor/
├── .gitignore
├── README.md
├── composer.json
├── README.md
├── composer.json
└── phpunit.xml.dist
├── composer.json
└── README.md
├── tests/
└── vendor/
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ## 8. 依赖管理
Laravel 扩展包的依赖管理是其生态系统的重要组成部分,包括配置文件和服务提供者。依赖管理确保包能够正确加载和集成到 Laravel 应用中。
## 9. 测试/测试文件定义了包的配置选项,允许用户自定义扩展包的行为。 ## 迁移/ ├── database/ ├── resources/ ├── src/ ├── tests/ ├── README.md ├── LICENSE └── composer.json
|
开发和贡献
Laravel 扩展包的开发需要遵循最佳实践,包括清晰的配置文件和资源管理。贡献者可以通过配置文件和资源文件来扩展包的功能。
依赖和资源
扩展包的依赖管理确保包能够正确集成到 Laravel 应用中。配置文件定义了扩展包的默认行为。
测试和贡献
扩展包的测试和贡献是确保功能完整性的重要环节。测试验证功能的正确性,贡献者可以提供反馈和改进建议。
安装和使用
通过 Composer 安装扩展包:
1
| composer require your-package-name
|
配置和发布
配置文件定义了扩展包的默认设置。
总结
Laravel 扩展包是构建可配置、可扩展的 Laravel 应用的基础。它提供了模块化的结构,支持配置、资源和测试,确保应用的灵活性和可维护性。
└── composer.json
Laravel 扩展包的开发需要遵循 Laravel 生态系统的标准结构,确保配置和资源的正确加载。
测试和文档
├── tests/
├── src/
├── vendor/
├── src/
├── README.md
├── composer.json
1 2 3 4 5 6 7 8 9 10 11
| ## 安装和配置
扩展包的安装和配置是确保功能正确集成的关键步骤。通过 Composer 安装扩展包,配置文件定义了默认设置。
## 安装和测试 ├── tests/ ├── src/ ├── README.md ├── composer.json └── vendor/
|
扩展包的结构和配置确保了功能的模块化和可扩展性。
8. 贡献和支持
Laravel 扩展包的开发需要社区的支持和贡献。贡献者可以提供配置、文档和测试,确保功能的完整性和可靠性。
9. 测试和贡献
扩展包的测试和贡献是确保质量的重要环节。测试验证功能的正确性,贡献者可以提供改进建议和反馈。
Laravel 扩展包的开发遵循标准的 Laravel 结构,包括配置、资源和测试。通过 Composer 安装和管理,确保功能的正确集成和使用。
依赖管理
扩展包的依赖管理确保功能的正确加载和配置。配置文件定义了默认设置,测试验证功能的正确性。
总结
Laravel 扩展包的开发需要遵循 Laravel 的标准结构和最佳实践,确保功能的可扩展性和可靠性。通过社区的支持和贡献,扩展包可以提供灵活的配置和集成选项。