第 24 章 — 框架概览
第 24 章 — 框架概览:Laravel、Symfony、路由与中间件
24.1 PHP 框架对比
| 特性 | Laravel | Symfony | Slim | Hyperf |
|---|---|---|---|---|
| 定位 | 全栈框架 | 企业级框架 | 微框架 | 高性能微服务 |
| 学习曲线 | ⭐⭐ 低 | ⭐⭐⭐⭐ 高 | ⭐ 最低 | ⭐⭐⭐ 中 |
| ORM | Eloquent | Doctrine | 无/可选 | 无/可选 |
| 模板引擎 | Blade | Twig | 无 | 无 |
| 队列 | 内置 | Messenger | 无 | 内置 |
| 实时 | Broadcasting | Mercure | 无 | WebSocket |
| 协程支持 | ❌ | ❌ | ❌ | ✅ (Swoole) |
| 包管理 | Composer | Composer | Composer | Composer |
| 最适合 | Web 应用 | 大型项目 | API | 高并发 |
24.2 Laravel 入门
# 创建项目
composer create-project laravel/laravel my-app
cd my-app
# 启动开发服务器
php artisan serve
# 常用命令
php artisan make:model User -mcr # 模型 + 迁移 + 控制器
php artisan make:middleware Auth # 中间件
php artisan migrate # 运行迁移
php artisan db:seed # 填充数据
php artisan queue:work # 处理队列
24.2.1 路由
<?php
// routes/web.php
use App\Http\Controllers\UserController;
Route::get('/', function () {
return view('welcome');
});
Route::resource('users', UserController::class);
Route::middleware(['auth', 'verified'])->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index']);
Route::get('/profile', [ProfileController::class, 'edit']);
});
24.2.2 控制器
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function index(Request $request)
{
$users = User::query()
->when($request->search, fn($q, $s) => $q->where('name', 'like', "%{$s}%"))
->paginate(15);
return view('users.index', compact('users'));
}
public function store(Request $request)
{
$validated = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
]);
$user = User::create($validated);
return redirect()->route('users.show', $user)
->with('success', '用户创建成功');
}
}
24.2.3 Eloquent ORM
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Model
{
use SoftDeletes;
protected $fillable = ['name', 'email', 'password'];
protected $hidden = ['password', 'remember_token'];
protected $casts = [
'email_verified_at' => 'datetime',
'password' => 'hashed',
];
public function posts()
{
return $this->hasMany(Post::class);
}
public function latestPost()
{
return $this->hasOne(Post::class)->latestOfMany();
}
}
// 使用
$user = User::find(1);
$user->posts()->create(['title' => 'Hello']);
$posts = $user->posts()->where('active', true)->get();
24.3 Symfony 入门
# 创建项目
symfony new my-app --webapp
# 或
composer create-project symfony/skeleton my-app
# 启动
symfony serve
24.3.1 控制器与路由
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Attribute\Route;
class UserController extends AbstractController
{
#[Route('/users', name: 'user_index', methods: ['GET'])]
public function index(): JsonResponse
{
$users = $this->entityManager->getRepository(User::class)->findAll();
return $this->json($users);
}
#[Route('/users/{id}', name: 'user_show', methods: ['GET'])]
public function show(int $id): JsonResponse
{
$user = $this->entityManager->getRepository(User::class)->find($id);
if (!$user) {
return $this->json(['error' => 'Not found'], 404);
}
return $this->json($user);
}
}
24.4 中间件模式
<?php
// Laravel 中间件
class EnsureTokenIsValid
{
public function handle(Request $request, Closure $next): Response
{
$token = $request->bearerToken();
if (!$token || !$this->isValidToken($token)) {
return response()->json(['error' => 'Unauthorized'], 401);
}
return $next($request);
}
}
<?php
// PSR-15 中间件(框架无关)
class CorsMiddleware implements MiddlewareInterface
{
public function process(
ServerRequestInterface $request,
RequestHandlerInterface $handler,
): ResponseInterface {
$response = $handler->handle($request);
return $response
->withHeader('Access-Control-Allow-Origin', '*')
->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE')
->withHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
}
}
24.5 Slim 框架(微框架)
<?php
use Slim\Factory\AppFactory;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
$app = AppFactory::create();
$app->get('/users', function (ServerRequestInterface $request, ResponseInterface $response) {
$users = $this->get(UserRepository::class)->findAll();
$response->getBody()->write(json_encode($users));
return $response->withHeader('Content-Type', 'application/json');
});
$app->run();
24.6 扩展阅读
上一章:第 23 章 — 性能优化 下一章:第 25 章 — Docker 部署