Zend Framework 和 Laminas
你需要了解一个非常重要的历史节点:

- Zend Framework 2 (ZF2) 和 Zend Framework 3 (ZF3) 是由 Zend 公司主导的开源 PHP 框架。
- 2025 年,Zend 公司将其核心团队和项目转移到了一个名为 Laminas 的非营利性基金会。
- Zend Framework 3 是最后一个由 Zend 公司发布的版本。
- 之后,所有的新开发都在 Laminas Project 下进行,它现在是 The PHP Framework Interop Group (PHP-FIG) 的一部分,更现代、更灵活。
- 现在如果你要学习 "Zend",你实际上有两个选择:
- 学习 Laminas: 这是当前推荐的方向,它继承了 Zend Framework 的精髓,但采用了更现代的架构和依赖注入管理,并且与 PSR 标准高度兼容,Laminas 官方文档是首选。
- 学习 Zend Framework 3: 如果你需要维护一个旧的 ZF3 项目,或者想了解其经典架构,可以学习 ZF3,但请注意,它已经不再积极开发。
本教程将以 Laminas 为核心进行讲解,因为它代表了未来的方向。 我们会穿插说明 ZF3 与 Laminas 的主要区别。
第一部分:Laminas 框架核心概念
在开始写代码之前,理解 Laminas 的几个核心概念至关重要。
MVC 架构模式
Laminas 是一个基于 MVC (Model-View-Controller) 设计模式的框架。
- Model (模型): 负责数据和业务逻辑,它通常与数据库交互,处理数据的增删改查,在 Laminas 中,你可能会使用 Doctrine 这样的 ORM 来创建模型。
- View (视图): 负责展示数据,它通常是 HTML 模板文件,其中混合了 PHP 代码(或模板引擎如 Twig)来显示从 Controller 传递过来的数据,视图文件位于
module/Application/view/application/目录下。 - Controller (控制器): 作为 Model 和 View 之间的桥梁,它接收用户的请求(通过 URL),调用相应的 Model 处理数据,然后将数据传递给 View 进行渲染,最后将响应返回给用户,控制器是应用的核心逻辑所在。
模块化
Laminas 应用是由多个模块 组成的,每个模块都是一个自包含的 MVC 应用,可以有自己的控制器、视图、模型和配置,这使得大型应用的结构非常清晰,便于维护和复用。

Application模块是默认模块,处理应用的基本路由和配置。- 你可以创建自己的模块,
Blog,User等。
依赖注入
这是现代框架的核心,在 Laminas 中,你不需要手动 new 一个对象,相反,你向“容器”(一个管理所有对象的服务管理器)声明你需要什么,容器会自动为你创建并注入依赖。
- 优点: 解耦代码、易于测试、配置集中管理。
- 实现:通过
config/config.php和module.config.php来配置哪些类需要被容器管理。
路由
路由决定了 URL 如何映射到具体的 Controller 和 Action。
- 一个 URL
http://example.com/blog/post/1可能会被路由到Blog模块的PostController控制器的viewAction方法,并将1作为参数传递。
中间件
中间件是处理 HTTP 请求和响应的“层”,你可以把它想象成一个流水线,请求和响应依次通过每个中间件,每个中间件都可以做一些处理(比如认证、日志记录、CORS 等),Laminas 完全支持 PSR-15 中间件标准。
第二部分:实战教程 - 搭建你的第一个 Laminas 应用
我们将使用 Composer 来安装和管理 Laminas 项目。

步骤 1: 安装 Composer
如果你还没有安装 Composer,请先从 getcomposer.org 下载并安装。
步骤 2: 创建 Laminas 项目
打开你的终端,运行以下命令:
composer create-project laminas/laminas-skeleton-application my-laminas-app
laminas/laminas-skeleton-application是 Laminas 的官方项目骨架。my-laminas-app是你创建的项目目录名。
安装完成后,进入项目目录:
cd my-laminas-app
步骤 3: 启动开发服务器
Laminas 提供了一个内置的开发服务器,方便本地开发。
composer run -- -s development
或者,你也可以使用 PHP 内置的 Web 服务器:
php -S localhost:8088 -t public/
在浏览器中访问 http://localhost:8088,你应该能看到 Laminas 的欢迎页面。
步骤 4: 探索项目结构
理解项目结构是学习的第一步,主要目录如下:
my-laminas-app/
├── config/ # 全局配置文件
│ ├── config.php # 合并所有模块配置的入口
│ ├── autoload/ # 自动加载配置
│ └── modules.config.php # 启用的模块列表
├── module/ # 所有模块目录
│ └── Application/ # 默认的 Application 模块
│ ├── config/ # Application 模块的配置
│ ├── src/ # 源代码
│ │ ├── Controller/ # 控制器
│ │ └── ... # 其他类
│ └── view/ # 视图文件
│ └── application/ # Application 模块的视图
│ ├── layout/ # 布局模板
│ └── index/ # 控制器视图
├── public/ # Web 根目录,唯一能被外部访问的目录
│ ├── index.php # 前端控制器入口
│ └── .htaccess # Apache 重写规则,将所有请求指向 index.php
├── vendor/ # Composer 依赖包
└── composer.json # 项目依赖定义
步骤 5: 创建一个自定义模块
我们将创建一个简单的 Hello 模块。
创建模块目录和基本结构
# 在 module 目录下创建 Hello 目录
mkdir module/Hello
# 创建必要的子目录
mkdir module/Hello/{config,src,view}
mkdir module/Hello/src/Controller
mkdir module/Hello/view/hello
创建模块类
文件: module/Hello/src/Module.php
<?php
namespace Hello;
class Module
{
public function getConfig()
{
return include __DIR__ . '/../config/module.config.php';
}
}
创建模块配置
这个文件定义了模块的路由、控制器、视图管理器等。
文件: module/Hello/config/module.config.php
<?php
return [
'controllers' => [
'factories' => [
Controller\IndexController::class => InvokableFactory::class,
],
],
'router' => [
'routes' => [
'hello' => [
'type' => 'Segment',
'options' => [
'route' => '/hello[/:action]',
'constraints' => [
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
],
'defaults' => [
'controller' => Controller\IndexController::class,
'action' => 'index',
],
],
],
],
],
'view_manager' => [
'template_path_stack' => [
__DIR__ . '/../view',
],
],
];
创建控制器
文件: module/Hello/src/Controller/IndexController.php
<?php
namespace Hello\Controller;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
class IndexController extends AbstractActionController
{
public function indexAction()
{
// 你可以在这里获取数据,比如从数据库
$message = 'Hello, Laminas World!';
// 创建一个 ViewModel 并将数据传递给视图
return new ViewModel([
'message' => $message,
]);
}
}
创建视图
文件: module/Hello/view/hello/index/index.phtml
<h1>Hello Module</h1> <p><?= $this->escapeHtml($this->message) ?></p>
启用新模块
编辑 config/modules.config.php,将你的 Hello 模块添加到列表中。
<?php
return [
'Application',
'Hello', // 添加这一行
];
访问新模块
重启你的开发服务器,然后在浏览器中访问 http://localhost:8088/hello,你应该能看到 "Hello, Laminas World!" 的字样。
第三部分:进阶主题
数据库集成与 Doctrine ORM
Laminas 本身不包含数据库抽象层,但它与 Doctrine ORM 集成得非常好。
- 安装 Doctrine:
composer require laminas/laminas-db laminas/laminas-form doctrine/doctrine-orm-module
- 配置: 你需要在
config/autoload/{,*.}global.php中配置数据库连接和 Doctrine。 - 创建实体: 定义你的数据模型(如
User,Post),它们是普通的 PHP 类。 - 使用仓储: 在控制器中,你可以通过依赖注入获取实体仓储,然后进行数据库操作。
表单处理
Laminas 提供了强大的表单组件。
- 创建表单类: 继承
Laminas\Form\Form,定义表单元素(文本框、按钮等)和验证器。 - 在控制器中使用: 处理 GET 请求(显示表单)和 POST 请求(验证和保存数据)。
- 在视图中渲染: 使用
form视图助手轻松渲染整个表单或单个元素。
认证与授权
- 认证: 验证用户身份(“你是谁?”),Laminas 提供了
Laminas\Authentication组件,支持多种适配器(数据库、HTTP Basic、OAuth 等)。 - 授权: 验证用户是否有权限执行某个操作(“你能做什么?”),Laminas 提供了基于角色的访问控制,可以精细地控制控制器、Action 甚至视图元素的访问权限。
第四部分:学习资源
-
官方文档 (最重要)
- Laminas: https://docs.laminas.dev/ - 这是你学习的首要资源详尽且更新及时。
- Zend Framework 3 (历史): https://framework.zend.com/manual/3.0/en/ - 仅用于维护旧项目。
-
视频教程
- LaminasCast: https://laminascast.com/ - 专门针对 Laminas 的视频教程系列。
- Maksym Solin's YouTube Channel: 他有很多高质量的 Laminas 教程。
-
社区
- Laminas Slack: https://laminas.dev/slack/ - 官方聊天频道,遇到问题可以在这里提问。
- Stack Overflow: 使用标签
laminas-framework提问。
总结与建议
- 从 Laminas 开始: 忘记旧的 Zend Framework,直接学习 Laminas。
- 重视官方文档: Laminas 的文档写得非常好,是学习框架的最佳途径。
- 实践出真知: 不要只看教程,跟着动手创建自己的项目,从最简单的 CRUD 应用开始,逐步增加功能。
- 理解核心概念: MVC、依赖注入、路由是现代框架的基石,务必花时间理解透彻。
- 拥抱 PSR 标准: Laminas 与 PSR 标准(如 PSR-7 HTTP 消息、PSR-15 中间件)紧密结合,了解这些标准会让你对 PHP 生态有更深的理解。
