Skip to content

CakePHP / Slim / Laminas

除了 Laravel、Symfony、ThinkPHP 和 Yii 之外,PHP 生态中还有许多优秀的框架和工具。本节将介绍三个有代表性的 PHP 框架:CakePHP(全栈框架,历史最悠久之一)、Slim(微框架,专注 PSR-7/PSR-15)、Laminas(Zend Framework 的继任者,企业级组件库)。了解它们的特性和适用场景,可以帮助你为项目做出更合适的技术选型。

前置知识

阅读本节前,建议先了解:

CakePHP

概述

CakePHP 是最古老的 PHP 框架之一,始于 2005 年。它遵循 MVC 架构,提供了快速开发所需的全部工具。CakePHP 4.x 是当前主要版本,支持 PHP 8.1+。

特点

特性说明
约定优于配置减少配置文件,通过命名约定自动关联
ORM强大的类型化 ORM
Bake 代码生成类似 Yii 的 Gii 代码生成工具
模板引擎内置模板引擎
国际化内置完善的 i18n 支持
测试内置 PHPUnit 集成

快速上手

bash
# 创建项目
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
<?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 或模板引擎
路由简洁强大的路由系统

快速上手

bash
# 创建项目
composer create-project slim/slim-skeleton myapp

# 启动开发服务器
composer start-server
# 或
php -S localhost:8080 -t public/
php
<?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
<?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 提供 mezziolaminas-mvc 两种应用骨架来构建完整的 MVC 应用。

特点

特性说明
企业级Zend Framework 的企业级基因
组件化60+ 独立组件可单独使用
PSR 规范严格遵循 PSR 标准
可组合灵活选择需要的组件
MezzioPSR-15 中间件应用
MVC提供 MVC 应用层

快速上手(Mezzio)

bash
# 创建 Mezzio 项目
composer create-project mezzio/mezzio-skeleton myapp

# 或创建 Laminas MVC 项目
composer create-project laminas/laminas-mvc-skeleton myapp
php
<?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
<?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 组件

bash
# 仅使用特定组件
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
<?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

bash
# Swoole 提供了 PHP 的协程/异步编程能力
composer require swoole/core

# 运行 HTTP 服务器
php server.php
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

bash
# Hyperf — 基于 Swoole 的协程框架
composer create-project hyperf/hyperfSkeleton myapp

Hyperf 是一个基于 Swoole 4.5+ 协程引擎的高性能 PHP 框架,提供了类似 Spring Boot 的注解驱动开发方式,适用于微服务和 API 场景。

特性HyperfLaravelSwoole
运行方式常驻内存请求-响应扩展/服务器
异步支持协程不支持原生
性能极高中等极高
学习曲线较高中等
生态中等丰富较少

框架选型对比

框架类型学习曲线生态适用场景
Laravel全栈丰富中大型 Web 应用
Symfony模块化丰富大型企业项目
ThinkPHP全栈中文社区中小型项目
Yii全栈中等快速开发
CakePHP全栈中等快速开发
Slim微框架中等API、微服务
Laminas组件库企业级企业项目、微服务

实战示例

场景一:用 Slim 构建 API

bash
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
<?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 框架中路由机制的通用原理。

参考链接