1.3. 构建我们的 PHP 框架
构建框架的方法有很多。有些开发者喜欢复杂而功能丰富的框架,而有些人更偏好简洁轻量的方案。在本系列文章中,我们将快速构建一个易于使用、易于理解的简易 PHP 框架。
这些文章将帮助你开发属于你自己的框架。虽然我们这里的示例是为了构建一个网上商店,但你可以轻松扩展框架的功能以适应其他需求。本系列的主要目标是教你如何从零开始构建一个适用于任何 CMS 的自定义框架。
设计模式(Patterns)
在框架开发中,通常会用到多种设计模式(Design Patterns)。设计模式是一些经过验证的最佳实践,用来解决软件开发中的常见问题。在本教程中,我们将使用以下几种模式:
- MVC(Model-View-Controller,模型-视图-控制器)
- Registry(注册器模式)
- Singleton(单例模式)
MVC(模型-视图-控制器)
MVC 是我们框架的核心结构,它能将应用程序的用户界面与业务逻辑分离。视图(View)与数据模型(Model)交互的中间层是控制器(Controller),控制器负责处理业务逻辑并操作模型中的数据。
例如,当用户在页面上点击“加入购物车”时,控制器会接收到该请求,调用购物车模型(Model)来添加商品。随后,购物车模型会返回当前购物车中的商品数量,控制器再将这些数据传递给视图以更新显示。
我们将基于 MVC 模式构建自己的框架,并在此基础上扩展功能。模型中的数据来自数据库,而模型的字段与数据库表中的字段一一对应。最终,控制器将这些数据传递给视图层,视图层再将内容输出到浏览器中。
Registry(注册器模式)
注册器 提供了一个集中存储框架中各个对象的机制。在 MVC 模式下,由于模块之间存在一定的抽象层,因此需要一种方法来在不同组件间共享对象。每个控制器或模型(如商品、购物车、页面)通常都需要执行一些通用操作,例如:
- 与数据库交互
- 检查用户登录状态
- 将数据发送到视图层(模板系统)
- 发送电子邮件(例如订单确认)
- 与文件系统交互(例如上传商品图片)
多数框架都会通过对象来封装这些通用操作,而注册器就是用来统一管理这些对象的。注册器可以在框架的任何地方被访问,从而方便获取或调用共享资源。下面是注册器工作机制的示意图:
框架在需要时直接访问注册器,注册器则为其他对象提供所需资源。注册器内部的对象也可以相互交互,例如模板管理器可以与文件管理器通信,邮件发送器可以使用邮件模板对象。
Singleton(单例模式)
单例模式(Singleton) 是最简单也最常见的设计模式之一。它的作用是确保某个类在系统中只有一个实例存在,并能在应用的任何地方访问到该实例。
单例通常用于那些只需要一个全局对象的场景。例如,数据库连接类。我们希望数据库连接只被创建一次,然后供整个系统共享使用。
换句话说,单例类在应用程序生命周期中只实例化一次,其它所有调用者都使用同一个实例。
总体结构
接下来,我们需要规划框架的整体目录结构。它应该包含以下几个部分:
- Models(模型)
- Views(视图)— 其中可以包含不同的主题样式目录
- Controllers(控制器)— 每个功能模块有独立的控制器目录
- Admin Controllers(后台控制器)— 用于管理网站内容的部分
- Registry(注册器)
- Registry/Objects(注册器中的对象)
- Uploads(上传目录,用于存储图片或文件)
- Libraries(外部库)
- Miscellaneous(其他辅助代码)
因此,我们的框架文件夹结构可以如下(采用英文命名以符合 PHP 社区规范):
- Models
- Views
- View A
- Templates
- Images
- JavaScript
- Controllers
- Controller A
- ControllerA
- ControllerAAdmin
- Controller A
- Registry
- Objects
- Database objects
- Assets
- Uploads
- 将来添加商品和图片功能后会扩展此目录
- Libraries
- Miscellaneous