CakePHP / Slim / Laminas
除了 Laravel、Symfony、ThinkPHP 和 Yii 之外,PHP 生态中还有许多优秀的框架和工具。本节将介绍三个有代表性的 PHP 框架:CakePHP(全栈框架,历史最悠久之一)、Slim(微框架,专注 PSR-7/PSR-15)、Laminas(Zend Framework 的继任者,企业级组件库)。了解它们的特性和适用场景,可以帮助你为项目做出更合适的技术选型。
前置知识
阅读本节前,建议先了解:
- PHP 框架概览(参见 Laravel 或 Symfony)
- PSR 规范基础(参见 其他 PSR 规范概览)
- Composer 基本命令(参见 Composer 基本命令)
CakePHP
概述
CakePHP 是最古老的 PHP 框架之一,始于 2005 年。它遵循 MVC 架构,提供了快速开发所需的全部工具。CakePHP 4.x 是当前主要版本,支持 PHP 8.1+。
特点
| 特性 | 说明 |
|---|---|
| 约定优于配置 | 减少配置文件,通过命名约定自动关联 |
| ORM | 强大的类型化 ORM |
| Bake 代码生成 | 类似 Yii 的 Gii 代码生成工具 |
| 模板引擎 | 内置模板引擎 |
| 国际化 | 内置完善的 i18n 支持 |
| 测试 | 内置 PHPUnit 集成 |
快速上手
# 创建项目
composer create-project cakephp/app myapp
# 启动开发服务器
bin/cake server
# 代码生成
bin/cake bake all users # 生成 User 的完整 CRUD
bin/cake bake controller Users
bin/cake bake model User
bin/cake bake template Users<?php
declare(strict_types=1);
namespace App\Controller;
use App\Controller\AppController;
class UsersController extends AppController
{
public function index()
{
$users = $this->paginate($this->Users);
$this->set(compact('users'));
}
public function add()
{
$user = $this->Users->newEmptyEntity();
if ($this->request->is('post')) {
$user = $this->Users->patchEntity($user, $this->request->getData());
if ($this->Users->save($user)) {
$this->Flash->success(__('用户已保存'));
return $this->redirect(['action' => 'index']);
}
$this->Flash->error(__('保存失败'));
}
$this->set(compact('user'));
}
}适用场景
- 需要快速开发的中小型项目
- 喜欢约定优于配置的团队
- 需要 Bake 代码生成工具提高效率
Slim
概述
Slim 是一个轻量级的 PHP 微框架,专注于 PSR-7 和 PSR-15(HTTP 中间件)规范。它不提供 ORM、模板引擎等内置组件,而是允许开发者自由选择第三方库来构建应用。Slim 适合构建 API 和微服务。
特点
| 特性 | 说明 |
|---|---|
| 极简 | 核心仅几百行代码 |
| PSR-7 | 原生支持 HTTP 消息接口 |
| PSR-15 | 原生支持 HTTP 中间件 |
| PSR-3 | 原生支持日志接口 |
| 灵活 | 不强制任何 ORM 或模板引擎 |
| 路由 | 简洁强大的路由系统 |
快速上手
# 创建项目
composer create-project slim/slim-skeleton myapp
# 启动开发服务器
composer start-server
# 或
php -S localhost:8080 -t public/<?php
declare(strict_types=1);
use App\Application;
use App\Middleware\ExampleMiddleware;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
require __DIR__ . '/../vendor/autoload.php';
$app = AppFactory::create();
// 添加中间件
$app->add(new ExampleMiddleware());
// 基本路由
$app->get('/', function (Request $request, Response $response) {
$response->getBody()->write('Hello World');
return $response;
});
// JSON 响应
$app->get('/api/users', function (Request $request, Response $response) {
$data = [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob'],
];
$payload = json_encode($data);
$response->getBody()->write($payload);
return $response->withHeader('Content-Type', 'application/json');
});
// 带参数的路由
$app->get('/api/users/{id}', function (Request $request, Response $response, array $args) {
$userId = (int) $args['id'];
$response->getBody()->write(json_encode(['id' => $userId]));
return $response->withHeader('Content-Type', 'application/json');
});
$app->run();中间件实现
<?php
declare(strict_types=1);
namespace App\Middleware;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
class JsonBodyParserMiddleware implements MiddlewareInterface
{
public function process(Request $request, RequestHandler $handler): Response
{
$contentType = $request->getHeaderLine('Content-Type');
if (str_contains($contentType, 'application/json')) {
$body = (string) $request->getBody();
$parsed = json_decode($body, true);
if (json_last_error() === JSON_ERROR_NONE) {
$request = $request->withParsedBody($parsed);
}
}
return $handler->handle($request);
}
}
class CorsMiddleware implements MiddlewareInterface
{
public function process(Request $request, RequestHandler $handler): Response
{
$response = $handler->handle($request);
return $response
->withHeader('Access-Control-Allow-Origin', '*')
->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
->withHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
}
}适用场景
- 构建 RESTful API
- 微服务架构
- 需要轻量级、可定制的项目
- 学习 PSR-7/PSR-15 规范
Laminas
概述
Laminas 是 Zend Framework 的继任者,由 Linux Foundation 赞助维护。它不是一个单一的框架,而是一个包含 60+ 组件的库集合,可以独立使用也可以组合使用。Laminas 提供 mezzio 和 laminas-mvc 两种应用骨架来构建完整的 MVC 应用。
特点
| 特性 | 说明 |
|---|---|
| 企业级 | Zend Framework 的企业级基因 |
| 组件化 | 60+ 独立组件可单独使用 |
| PSR 规范 | 严格遵循 PSR 标准 |
| 可组合 | 灵活选择需要的组件 |
| Mezzio | PSR-15 中间件应用 |
| MVC | 提供 MVC 应用层 |
快速上手(Mezzio)
# 创建 Mezzio 项目
composer create-project mezzio/mezzio-skeleton myapp
# 或创建 Laminas MVC 项目
composer create-project laminas/laminas-mvc-skeleton myapp<?php
declare(strict_types=1);
// Mezzio 路由配置
// config/routes.php
use Mezzio\Application;
use Mezzio\Middleware\ErrorHandlerMiddleware;
use Laminas\Diactoros\Response\JsonResponse;
return function (Application $app): void {
$app->get('/', function ($request, $handler) {
return new JsonResponse(['message' => 'Hello World']);
});
$app->get('/api/users', \App\Handler\UsersHandler::class);
};<?php
declare(strict_types=1);
namespace App\Handler;
use Laminas\Diactoros\Response\JsonResponse;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
class UsersHandler implements RequestHandlerInterface
{
public function handle(ServerRequestInterface $request): ResponseInterface
{
return new JsonResponse([
'users' => [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob'],
],
]);
}
}独立使用 Laminas 组件
# 仅使用特定组件
composer require laminas/laminas-http
composer require laminas/laminas-mail
composer require laminas/laminas-validator
composer require laminas/laminas-di
composer require laminas/laminas-i18n<?php
declare(strict_types=1);
// 独立使用验证器
use Laminas\Validator\EmailAddress;
use Laminas\Validator\StringLength;
use Laminas\Validator\ValidatorChain;
$validator = new ValidatorChain();
$validator->attach(new EmailAddress())
->attach(new StringLength(['min' => 5, 'max' => 255]));
if ($validator->isValid('user@example.com')) {
echo 'Valid!';
}适用场景
- 需要企业级稳定性的项目
- 遗留 Zend Framework 项目的升级
- 需要大量可复用组件的微服务
- 需要严格遵循 PSR 规范的项目
微框架对比
除了 Slim,PHP 生态中还有一些其他微框架值得了解:
Swoole / OpenSwoole
# Swoole 提供了 PHP 的协程/异步编程能力
composer require swoole/core
# 运行 HTTP 服务器
php server.php<?php
// server.php — Swoole HTTP 服务器
declare(strict_types=1);
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
$server = new Server('0.0.0.0', 9501);
$server->on('request', function (Request $request, Response $response): void {
$path = $request->server['request_uri'];
// 简单路由
if ($path === '/') {
$response->end('Hello from Swoole!');
} elseif ($path === '/api/time') {
$response->header('Content-Type', 'application/json');
$response->end(json_encode(['time' => date('Y-m-d H:i:s')]));
} else {
$response->status(404);
$response->end('Not Found');
}
});
$server->start();Swoole 的特点
Swoole 是一个高性能的 PHP 扩展,提供了协程、异步 I/O、HTTP/WebSocket 服务器等功能,使得 PHP 可以用于常驻内存的高并发场景。
Hyperf
# Hyperf — 基于 Swoole 的协程框架
composer create-project hyperf/hyperfSkeleton myappHyperf 是一个基于 Swoole 4.5+ 协程引擎的高性能 PHP 框架,提供了类似 Spring Boot 的注解驱动开发方式,适用于微服务和 API 场景。
| 特性 | Hyperf | Laravel | Swoole |
|---|---|---|---|
| 运行方式 | 常驻内存 | 请求-响应 | 扩展/服务器 |
| 异步支持 | 协程 | 不支持 | 原生 |
| 性能 | 极高 | 中等 | 极高 |
| 学习曲线 | 较高 | 中等 | 高 |
| 生态 | 中等 | 丰富 | 较少 |
框架选型对比
| 框架 | 类型 | 学习曲线 | 生态 | 适用场景 |
|---|---|---|---|---|
| Laravel | 全栈 | 中 | 丰富 | 中大型 Web 应用 |
| Symfony | 模块化 | 高 | 丰富 | 大型企业项目 |
| ThinkPHP | 全栈 | 低 | 中文社区 | 中小型项目 |
| Yii | 全栈 | 中 | 中等 | 快速开发 |
| CakePHP | 全栈 | 中 | 中等 | 快速开发 |
| Slim | 微框架 | 低 | 中等 | API、微服务 |
| Laminas | 组件库 | 高 | 企业级 | 企业项目、微服务 |
实战示例
场景一:用 Slim 构建 API
composer require slim/slim:"^4"
composer require slim/psr7
composer require nyholm/psr7
composer require php-di/php-di
composer require php-di/slim-bridge<?php
declare(strict_types=1);
use Slim\Factory\AppFactory;
use DI\Container;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
$container = new Container();
$container->set('db', function () {
return new PDO('mysql:host=localhost;dbname=myapp', 'root', '');
});
$app = AppFactory::createFromContainer($container);
$app->get('/api/users/{id}', function (Request $request, Response $response, array $args) {
$db = $this->get('db');
$stmt = $db->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$args['id']]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$user) {
return $response->withStatus(404);
}
$response->getBody()->write(json_encode($user));
return $response->withHeader('Content-Type', 'application/json');
});
$app->run();下一节
继续学习:路由机制 — 了解 PHP 框架中路由机制的通用原理。