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
// 配置 CORS
// config/cors.php
return [
'paths' => ['api/*', 'sanctum/csrf-cookie'],
'allowed_methods' => ['*'],
'allowed_origins' => ['*'],
'allowed_origins_patterns' => [],
'allowed_headers' => ['*'],
'exposed_headers' => [],
'max_age' => 0,
'supports_credentials' => true,
];

// 保护路由
// routes/api.php
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
// 配置 User 模型
use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
}

// 配置 Auth 中间件
// config/auth.php
'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
// 配置队列连接
// config/queue.php
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => env('REDIS_QUEUE', 'default'),
'retry_after' => 90,
'block_for' => null,
],

// 启动 Horizon
php artisan horizon

// 访问仪表板
// http://your-app/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
// 配置 Telescope
// config/telescope.php
'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,
],

// 访问仪表板
// http://your-app/telescope

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')) {
// 编辑文章
}

Laravel Media Library

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
// 导出 Excel
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
// 生成 IDE 助手文件
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
npm install
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// vite.config.js
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
<!-- resources/views/welcome.blade.php -->
<!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

// app/Http/Livewire/Counter.php
class Counter extends Component
{
public $count = 0;

public function increment()
{
$this->count++;
}

public function render()
{
return view('livewire.counter');
}
}

// resources/views/livewire/counter.blade.php
<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

// app/Http/Kernel.php
protected $middlewareGroups = [
'web' => [
// ...
\App\Http\Middleware\HandleInertiaRequests::class,
],
];

// 基础布局
// resources/views/app.blade.php
<!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(),
]);
}
}

// Vue 组件
// resources/js/Pages/Users/Index.vue
<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
# 运行 Artisan 命令
./vendor/bin/sail artisan migrate

# 运行 Composer 命令
./vendor/bin/sail composer require package

# 运行 npm 命令
./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
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 的服务器管理平台,自动化部署和配置。

基本使用

  1. 创建服务器
  2. 连接 GitHub/GitLab
  3. 配置站点
  4. 部署应用
  5. 监控服务器

7. Laravel 在微服务架构中的应用

Laravel 12 可以在微服务架构中发挥重要作用,提供 API 服务和业务逻辑。

7.1 Laravel Octane

Octane 提供了高性能的应用服务器,基于 Swoole 或 RoadRunner,显著提高 Laravel 应用的性能。

安装与配置

1
2
3
4
5
6
7
composer require laravel/octane

# 安装 Swoole
pecl install swoole

# 或安装 RoadRunner
./vendor/bin/rr get

基本使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 启动 Octane
php artisan octane:start

# 配置 Octane
# config/octane.php
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-FPMLaravel Octane性能提升
简单请求500 QPS5000 QPS10x
复杂请求200 QPS2000 QPS10x
内存使用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
// routes/api.php
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');
});
});

// ApiGatewayController.php
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
// proto/user.proto
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 应用的基础。它提供了模块化的结构,支持配置、资源和测试,确保应用的灵活性和可维护性。

1

└── composer.json

1
2
```

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 的标准结构和最佳实践,确保功能的可扩展性和可靠性。通过社区的支持和贡献,扩展包可以提供灵活的配置和集成选项。