Zend Framework 全方位教程:从入门到实践
目录
- 什么是 Zend Framework?
- 版本选择:Zend Framework 2 vs. 3 vs. Laminas
- 环境准备
- 安装与项目创建
- 项目结构解析
- MVC 架构详解
- 路由
- 控制器
- 视图
- 数据库操作与 Doctrine 集成
- 表单处理
- 身份验证与授权
- 常用组件
- 学习资源与最佳实践
什么是 Zend Framework?
Zend Framework (ZF) 是一个成熟、功能丰富、企业级的 PHP 框架,它遵循 PSR (PHP Standards Recommendations) 标准,这意味着它的代码质量和互操作性非常高。

核心特点:
- 高度模块化:你可以只使用你需要的组件,比如只用它的路由器,或者只用它的数据库抽象层。
- 基于组件:它由一系列松耦合的组件构成,这些组件可以独立使用,也可以组合成一个完整的框架。
- 事件驱动架构:许多组件都基于事件循环,这提供了极大的灵活性和可扩展性。
- 强大的 MVC 模式:提供了清晰、可维护的 Model-View-Controller 结构。
- 企业级支持:拥有强大的社区和商业支持(由 Zend 公司提供)。
重要提示: 2025年,Zend 公司宣布将框架移交给了 Laminas 项目,现在有两个并行的版本:
- Zend Framework 3:最后一个由 Zend 公司维护的稳定版本。
- Laminas:社区驱动的继任者,是 ZF3 的直接分支,拥有更快的迭代和更开放的未来。
对于新项目,强烈推荐使用 Laminas,本教程将以 Laminas 为例进行讲解,但其核心概念与 ZF3 基本相同。
版本选择:ZF2 vs. ZF3 vs. Laminas
| 版本 | 状态 | 说明 | 建议 |
|---|---|---|---|
| Zend Framework 1 (ZF1) | 已过时 | 古老,不再维护。 | 绝对不要用于新项目。 |
| Zend Framework 2 (ZF2) | 已过时 | 引入了模块化,但架构较旧。 | 仅用于维护旧项目。 |
| Zend Framework 3 (ZF3) | 维护中 | 最后一个官方版本,基于 PSR。 | 可用于维护旧项目或需要特定商业支持的项目。 |
| Laminas | 推荐 | ZF3 的社区分支,积极开发,完全遵循 PSR。 | 所有新项目的首选。 |
环境准备
在开始之前,确保你的开发环境已经准备好:

- PHP:Laminas 要求 PHP 7.4 或更高版本。
php -v
- Composer:PHP 的依赖管理工具,用于安装 Laminas 和其他库。
composer --version
- Web 服务器:如 Apache 或 Nginx。
- 数据库:如 MySQL/MariaDB 或 PostgreSQL。
- 代码编辑器:如 VS Code, PhpStorm。
安装与项目创建
最简单的方式是使用官方的安装程序 laminas-project-installer。
步骤 1: 安装 Laminas 安装器
composer global require laminas/laminas-project-installer
确保你的 ~/.composer/vendor/bin 目录在系统的 PATH 环境变量中。
步骤 2: 创建新项目
运行 laminas 命令,它会交互式地引导你创建项目。
laminas new my-laminas-app
它会让你选择安装模式,对于初学者,选择 minimal (最小化) 或 expressive (更灵活) 都可以,这里我们选择 minimal。

What type of installation would you like to create? [1] Minimal project (minimal) [2] Modular application with laminas-mvc (mvc) [3] Modular application with Mezzio (expressive) <-- 功能更强大,类似 Express.js [4] Empty project (empty) > 1
安装完成后,进入项目目录:
cd my-laminas-app
步骤 3: 安装依赖并启动开发服务器
composer install
Laminas 内置了一个简单的 PHP 开发服务器,非常适合开发阶段。
composer serve
在浏览器中打开 http://localhost:8080,你应该能看到 Laminas 的欢迎页面。
项目结构解析
一个典型的 Laminas (或 ZF3) 项目结构如下:
my-laminas-app/
├── composer.json # 项目依赖配置
├── config/ # 全局配置文件
│ ├── autoload/ # 自动加载配置
│ ├── application.config.php # 应用主入口配置
│ └── modules.config.php # 模块配置
├── public/ # Web 根目录
│ └── index.php # 应用前端控制器
├── module/ # 存放所有模块
│ └── Application/ # 默认的 Application 模块
│ ├── config/ # 模块配置
│ ├── src/ # 模块源代码
│ │ ├── Controller/
│ │ ├── Model/
│ │ └── View/
│ └── view/ # 模块视图文件
└── data/ # 存储缓存、日志等运行时数据
关键概念:模块
Laminas 是一个模块化的框架,你的应用被拆分成一个个独立的模块。module/Application 是默认模块,包含了应用的核心逻辑。
MVC 架构详解
MVC 是 Laminas 的核心设计模式。
路由
当请求到达时,Laminas 的路由器会检查 URL,并将其映射到一个特定的控制器和动作。
默认路由规则是:/模块/控制器/动作
URL http://localhost:8080/blog 会被解析为:
- 模块:
Application(默认) - 控制器:
Blog - 动作:
index(默认)
路由配置通常在 module/Application/config/module.config.php 文件中。
控制器
控制器负责接收请求、调用业务逻辑、并返回响应。
创建一个新控制器:
- 在
module/Application/src/Controller/目录下创建BlogController.php。 - 继承
AbstractActionController。
// module/Application/src/Controller/BlogController.php
namespace Application\Controller;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
class BlogController extends AbstractActionController
{
// 对应 URL /blog
public function indexAction()
{
// 这里可以获取博客文章数据
$posts = [
['id' => 1, 'title' => 'Hello Laminas!'],
['id' => 2, 'title' => 'Learning MVC'],
];
// 将数据传递给视图
return new ViewModel(['posts' => $posts]);
}
// 对应 URL /blog/view/1
public function viewAction()
{
// 从 URL 参数中获取 ID
$id = $this->params()->fromRoute('id');
// 根据ID查找文章...
$post = ['id' => $id, 'title' => 'Post ' . $id];
return new ViewModel(['post' => $post]);
}
}
视图
视图负责展示数据,Laminas 默认使用 PHP 模板,文件扩展名为 .phtml。
视图文件位于 module/Application/view/application/控制器名/动作名.phtml。
创建视图文件:
- 创建目录:
module/Application/view/application/blog/ - 创建文件:
module/Application/view/application/blog/index.phtml
<!-- module/Application/view/application/blog/index.phtml -->
<h1>Blog Posts</h1>
<ul>
<?php foreach ($this->posts as $post): ?>
<li>
<a href="<?php echo $this->url('blog', ['action' => 'view', 'id' => $post['id']]); ?>">
<?php echo $this->escapeHtml($post['title']); ?>
</a>
</li>
<?php endforeach; ?>
</ul>
访问 http://localhost:8080/blog,你就能看到渲染后的页面。
数据库操作与 Doctrine 集成
直接写 SQL 语句很繁琐,Laminas 提供了 Laminas\Db 组件进行数据库抽象,更推荐集成 Doctrine ORM,它让 PHP 对象和数据库表之间建立映射。
步骤 1: 安装 Doctrine
composer require doctrine/doctrine-orm-module
步骤 2: 配置 Doctrine
- 在
config/autoload/目录下创建doctrine.local.php文件。 - 配置数据库连接信息。
// config/autoload/doctrine.local.php
return [
'doctrine' => [
'connection' => [
// 与 module.config.php 中配置的名称保持一致
'orm_default' => [
'driverClass' => Laminas\Db\Adapter\Driver\Pdo\Pdo::class,
'params' => [
'host' => 'localhost',
'port' => '3306',
'user' => 'root',
'password' => 'your_password',
'dbname' => 'my_laminas_app',
]
]
]
]
];
步骤 3: 创建实体
实体是一个 PHP 类,代表数据库中的一张表。
// module/Application/src/Entity/Post.php
namespace Application\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="posts")
*/
class Post
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string")
*/
private $title;
// Getters and Setters
public function getId() { return $this->id; }
public function getTitle() { return $this->title; }
public function setTitle($title) { $this->title = $title; }
}
步骤 4: 在控制器中使用 Doctrine
- 在控制器中注入
Doctrine\ORM\EntityManager。 - 使用它来查询和保存数据。
// 在 BlogController 中
use Application\Entity\Post;
use Doctrine\ORM\EntityManager;
class BlogController extends AbstractActionController
{
private $entityManager;
// 通过构造函数注入 EntityManager
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}
public function indexAction()
{
$repository = $this->entityManager->getRepository(Post::class);
$posts = $repository->findAll(); // 查询所有文章
return new ViewModel(['posts' => $posts]);
}
}
注意:你需要配置依赖注入,让 Laminas 知道如何将 EntityManager 传递给控制器,这通常在 module/Application/config/module.config.php 的 controllers 和 service_manager 部分完成。
表单处理
Laminas 提供了强大的表单组件,可以用于创建表单、验证输入和过滤数据。
步骤 1: 创建表单类
// module/Application/src/Form/PostForm.php
namespace Application\Form;
use Laminas\Form\Form;
use Laminas\Form\Element\Text;
use Laminas\Form\Element\Submit;
class PostForm extends Form
{
public function __construct()
{
parent::__construct('post');
$this->add([
'name' => 'title',
'type' => Text::class,
'options' => [
'label' => 'Title',
],
]);
$this->add([
'name' => 'submit',
'type' => Submit::class,
'attributes' => [
'value' => 'Go',
'id' => 'submitbutton',
],
]);
}
}
步骤 2: 在控制器中使用表单
use Application\Form\PostForm;
class BlogController extends AbstractActionController
{
public function addAction()
{
$form = new PostForm();
$request = $this->getRequest();
if ($request->isPost()) {
$form->setData($request->getPost());
if ($form->isValid()) {
// 表单验证通过,处理数据
$data = $form->getData();
// ... 保存到数据库 ...
return $this->redirect()->toRoute('blog');
}
}
return ['form' => $form];
}
}
步骤 3: 在视图中渲染表单
<!-- module/Application/view/application/blog/add.phtml -->
<h1>Add New Post</h1>
<?php $form->prepare(); ?>
<?php echo $this->form()->openTag($form); ?>
<div class="form-group">
<?php echo $this->formLabel($form->get('title')); ?>
<?php echo $this->formElement($form->get('title')); ?>
<?php echo $this->formElementErrors($form->get('title')); ?>
</div>
<div class="form-group">
<?php echo $this->formElement($form->get('submit')); ?>
</div>
<?php echo $this->form()->closeTag(); ?>
身份验证与授权
Laminas 提供了基于组件的、非常灵活的认证和授权系统。
- 认证:验证“你是谁?”(用户名/密码是否正确)。
- 授权:验证“你能做什么?”(某个用户是否有权限删除文章)。
这个过程比较复杂,通常涉及:
- 创建身份验证适配器(如
Laminas\Authentication\Adapter\DbTable)。 - 创建控制器插件来处理登录逻辑。
- 创建一个
Laminas\Permissions\Acl(Access Control List) 对象来定义角色和权限。 - 在控制器中使用
isGranted()方法来检查权限。
由于篇幅限制,这里不展开详细代码,但理解这两个概念是使用 Laminas 进行安全开发的基础。
常用组件
Laminas 的强大之处在于其丰富的组件库,你可以在不使用完整 MVC 的情况下单独使用它们:
- Laminas\Config:强大的配置管理器,支持多种格式(INI, XML, JSON, PHP)。
- Laminas\Http:处理 HTTP 请求和响应的组件。
- Laminas\Log:灵活的日志记录系统。
- Laminas\Mail:发送电子邮件。
- Laminas\Cache:缓存数据以提高性能。
- Laminas\Diactoros:PSR-7 HTTP 消息的实现。
学习资源与最佳实践
官方文档
- Laminas Project: https://docs.laminas.dev/ (这是最重要的资源)
- Expressive: 如果你选择了
expressive安装模式,请参考 https://docs.laminas.dev/laminas-expressive/
推荐书籍
- Zend Framework in Action (虽然稍旧,但 MVC 思想依然适用)
- Laminas: The Definitive Guide (社区正在编写,可关注官方博客)
最佳实践
- 遵循 PSR:Laminas 严格遵循 PSR-1, PSR-2, PSR-4, PSR-7 等,你的代码也应该遵循。
- 模块化:将不同功能拆分成独立的模块,提高代码的可重用性和可维护性。
- 依赖注入:尽量使用构造函数注入或属性注入,而不是在类内部
new对象,这使代码更容易测试和解耦。 - 配置优于硬编码:将所有可变信息(如数据库凭据、API 密钥)放在配置文件中。
- 利用事件:善用事件系统,可以在不修改核心代码的情况下扩展功能。
Zend Framework / Laminas 是一个功能强大且结构严谨的框架,虽然学习曲线比一些轻量级框架要陡峭,但它为构建大型、复杂、可维护的企业级应用提供了坚实的基础,从 MVC 开始,逐步探索数据库、表单、认证等核心功能,你会发现它是一个值得信赖的开发伙伴,祝你学习愉快!
