logo

额外区块类型 (EBT) - 全新的布局构建器体验❗

额外区块类型 (EBT) - 样式化、可定制的区块类型:幻灯片、标签页、卡片、手风琴等更多类型。内置背景、DOM Box、JavaScript 插件的设置。立即体验布局构建的未来。

演示 EBT 模块 下载 EBT 模块

❗额外段落类型 (EPT) - 全新的 Paragraphs 体验

额外段落类型 (EPT) - 类似的基于 Paragraph 的模块集合。

演示 EPT 模块 滚动

滚动

1.3. 构建我们的 PHP 框架

07/10/2025, by Ivan

构建框架的方法有很多。有些开发者喜欢复杂而功能丰富的框架,而有些人更偏好简洁轻量的方案。在本系列文章中,我们将快速构建一个易于使用、易于理解的简易 PHP 框架。

这些文章将帮助你开发属于你自己的框架。虽然我们这里的示例是为了构建一个网上商店,但你可以轻松扩展框架的功能以适应其他需求。本系列的主要目标是教你如何从零开始构建一个适用于任何 CMS 的自定义框架。

设计模式(Patterns)

在框架开发中,通常会用到多种设计模式(Design Patterns)。设计模式是一些经过验证的最佳实践,用来解决软件开发中的常见问题。在本教程中,我们将使用以下几种模式:

  • MVC(Model-View-Controller,模型-视图-控制器)
  • Registry(注册器模式)
  • Singleton(单例模式)

MVC(模型-视图-控制器)

MVC 是我们框架的核心结构,它能将应用程序的用户界面与业务逻辑分离。视图(View)与数据模型(Model)交互的中间层是控制器(Controller),控制器负责处理业务逻辑并操作模型中的数据。

例如,当用户在页面上点击“加入购物车”时,控制器会接收到该请求,调用购物车模型(Model)来添加商品。随后,购物车模型会返回当前购物车中的商品数量,控制器再将这些数据传递给视图以更新显示。

MVC

我们将基于 MVC 模式构建自己的框架,并在此基础上扩展功能。模型中的数据来自数据库,而模型的字段与数据库表中的字段一一对应。最终,控制器将这些数据传递给视图层,视图层再将内容输出到浏览器中。

MVC scheme

Registry(注册器模式)

注册器 提供了一个集中存储框架中各个对象的机制。在 MVC 模式下,由于模块之间存在一定的抽象层,因此需要一种方法来在不同组件间共享对象。每个控制器或模型(如商品、购物车、页面)通常都需要执行一些通用操作,例如:

  • 与数据库交互
  • 检查用户登录状态
  • 将数据发送到视图层(模板系统)
  • 发送电子邮件(例如订单确认)
  • 与文件系统交互(例如上传商品图片)

多数框架都会通过对象来封装这些通用操作,而注册器就是用来统一管理这些对象的。注册器可以在框架的任何地方被访问,从而方便获取或调用共享资源。下面是注册器工作机制的示意图:

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
  • Registry
    • Objects
    • Database objects
  • Assets
  • Uploads
    • 将来添加商品和图片功能后会扩展此目录
  • Libraries
  • Miscellaneous