强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

第 24 章 — 框架概览

第 24 章 — 框架概览:Laravel、Symfony、路由与中间件

24.1 PHP 框架对比

特性LaravelSymfonySlimHyperf
定位全栈框架企业级框架微框架高性能微服务
学习曲线⭐⭐ 低⭐⭐⭐⭐ 高⭐ 最低⭐⭐⭐ 中
ORMEloquentDoctrine无/可选无/可选
模板引擎BladeTwig
队列内置Messenger内置
实时BroadcastingMercureWebSocket
协程支持✅ (Swoole)
包管理ComposerComposerComposerComposer
最适合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 部署