☰
CodeIgniter 4.0.0-alpha.1 全面重写解析:从 CI3 到 CI4 的新包架构与源码印证
2026/10/10 11:54:30 网站建设 项目流程
  • 后端
  • Web框架

【免费下载链接】CodeIgniter4

Open Source PHP Framework (originally from EllisLab)

项目地址:https://gitcode.com/gh_mirrors/co/CodeIgniter4
点击查看免费下载

CodeIgniter 4 的首次公开预览版本 4.0.0-alpha.1(发布于 2018 年 9 月 28 日)标志着框架的一次彻底重写。本文以该版本的官方变更日志(user_guide_src/source/changelogs/v4.0.0-alpha.1.rst)为骨架,逐一解读这份"新包清单"中每个模块的定位与职责,并结合当前仓库(版本已迭代至 4.7.5-dev,见 system/CodeIgniter.php 中的CI_VERSION常量)的源码实现与测试用例,验证这些包从 alpha.1 至今的演进脉络。读完本文,你将完整掌握 CI4 的核心模块地图,理解自动加载、路由、数据库、HTTP、视图渲染等关键组件的代码组织方式与底层原理。

版本概况:一次彻底的框架重写

v4.0.0-alpha.1变更日志开篇即点明该版本的性质——"Rewrite of the CodeIgniter framework"。这是 CodeIgniter 4 项目对外发布的第一个 alpha 版本,其意义不在于功能完整,而在于确立全新的架构骨架:将原本 CI3 中相对扁平的组件体系,重组为命名空间化、职责清晰的包结构,并为后续 beta、RC 直至 4.0.0 正式版(对应仓库中的 user_guide_src/source/changelogs/v4.0.0.rst)奠定基础。

仓库根目录的 README.md 提供了对这一重写方向的权威注脚:Version 4 是一次"complete rewrite",目标是把代码质量和工程实践提升到更现代的水平,同时保留框架多年来受开发者喜爱的易用特性。一个标志性的架构变化是index.php不再位于项目根目录,而是移入public目录(对应仓库中的 public/index.php),实现公共入口与业务逻辑的物理隔离,Web 服务器只需暴露public目录即可。

从命名空间角度看,当前仓库 composer.json 通过 PSR-4 规则将CodeIgniter\命名空间直接映射到system/目录,这正是 alpha.1 确立的"系统代码全部置于system/下"布局的延续。换言之,下面这份新包清单中的几乎每一个类,你都能在今天仓库的system/目录里找到它的直系后代或演进形态。

新包清单总览

alpha.1 版本公布的"New Packages List"共包含约 30 个顶层包(Package),覆盖从底层基础设施到高层业务组件的完整分层。为便于理解,可将其归为四类:

  • 基础设施层:Autoloader(自动加载)、Config(配置)、Events(事件)、Files(文件)、Log(日志)
  • 运行时核心:CLI、Commands(命令行命令)、Router(路由)、HTTP(请求/响应)、Filters(过滤器)、View(视图渲染)
  • 数据与领域组件:Database(数据库)、Cache(缓存)、Validation(校验)、Format(格式化)、I18n(国际化/时间)、Images(图像)、Session(会话)、Security(安全)、Honeypot(蜜罐)、Throttle(限流)、Email(邮件)、Pager(分页)、Typography(排版)
  • 辅助与测试:API(响应 Trait)、Helpers(辅助函数)、Test(测试工具)、Debug(调试与工具栏)、ThirdParty(内置第三方库)

下面逐包展开说明其职责与源码依据。

基础设施层包详解

Autoloader:PSR-4 与传统 classmap 的双轨自动加载

Autoloader 包包含Autoloader与FileLocator两个核心类。从当前源码看,system/Autoloader/Autoloader.php 是一个"同时使用 PSR-4 自动加载与传统 classmap"的加载器:其构造函数接受一个配置数组,其中psr4键用于将命名空间前缀映射到目录,classmap键用于将具体类名直接映射到文件路径。这种设计既支持现代 PSR-4 命名空间约定,又保留了传统框架"类名即路径"的快速查找方式。

FileLocator(system/Autoloader/FileLocator.php)则承担"按名称在多个目录中定位文件"的职责——CI4 允许模块化扩展,视图、语言文件、配置等资源可能分布在多个命名空间目录中,FileLocator 负责按优先级搜索并返回首个命中路径,是模块化架构得以成立的基础设施。当前仓库还新增了带缓存的 system/Autoloader/FileLocatorCached.php 与统一接口 system/Autoloader/FileLocatorInterface.php,并在 tests/system/Autoloader 下配有完整测试,属 alpha.1 之后持续增强的部分。

Config:环境感知的配置体系

Config 包定义了 CI4 配置系统的骨架,包含BaseConfig(配置基类)、BaseService(服务基类)、DotEnv(.env 解析器)、AutoloadConfig、ForeignCharacters、Routes、Services、View等。

其中DotEnv(system/Config/DotEnv.php)是环境变量加载的核心:它定位项目根目录的.env文件并解析之,将其中定义的键值写入 PHP 的getenv()、$_ENV与$_SERVER,且明确"不强制要求 .env 文件存在"。这使开发者可以在不同环境(开发/测试/生产)间切换配置而不修改代码文件。BaseConfig与BaseService分别构成了 app/Config 下全部配置类与 system/Config/Services.php 服务工厂的父类基础,BaseService在 system/Config/BaseService.php 中通过getSharedInstance()模式实现单例式服务共享。

Events:事件发布与订阅

Events 包仅一个Events类(system/Events/Events.php),提供全局事件机制:开发者可在 app/Config/Events.php 中注册事件处理器,框架在特定生命周期节点(如请求前置、数据库查询、邮件发送等)调用Events::trigger()触发对应回调。它构成了 CI4 面向切面式扩展的基础,也是 Filters(过滤器)等机制之外的另一条扩展通道。

Files:统一的文件抽象

Files 包在 alpha.1 中仅列出File一个类。当前仓库中 system/Files/File.php 提供了基于 SplFileInfo 的文件操作封装,并派生了 system/Files/FileCollection.php(批量文件收集)与 system/Files/FileSizeUnit.php(文件大小单位换算)等配套类,相关测试位于 tests/system/Files。

Log:基于 PSR-3 的日志系统

Log 包由Logger、LoggerAwareTrait及若干 Handler 组成。当前 system/Log/Logger.php 实现了 PSR-3LoggerInterface,支持 File、ChromeLogger 等处理器(见 system/Log/Handlers),composer.json 中psr/log: ^3.0的依赖即由此而来。alpha.1 将PSR\Log列为内置的 ThirdParty 包,正是为了支撑这套日志接口的标准化实现。

运行时核心包详解

CLI:命令行交互基础设施

CLI 包定义了命令行三件套:BaseCommand(命令基类)、CLI(终端输出/输入工具)、Console(命令调度器)。alpha.1 清单中的CommandRunner在当前目录结构中已演进为 system/CLI/Console.php 承担类似角色。

从源码看,system/CLI/BaseCommand.php 是"创建 CLI 命令所用的抽象基类",子类需声明$group(分组)、$name(命令名)、$usage(用法)、$description(描述)、$options(选项说明)、$arguments(参数说明)等元数据,并实现run()方法。CLI类(system/CLI/CLI.php)则提供带颜色、进度条等能力的终端输出与input()交互读取。这条命令基础设施最终由项目根目录的 spark 可执行脚本暴露给开发者。

Commands:内置命令集

Commands 包是 alpha.1 中条目最丰富的包之一,按用途分为几组:

  • 通用:Help、ListCommands。当前 system/Commands/ListCommands.php 定义了名为list的命令,用于"列出可用命令",是了解框架能力的人口。
  • 数据库:CreateMigration、MigrateCurrent、MigrateLatest、MigrateRefresh、MigrateRollback、MigrateStatus、MigrateVersion、Seed。这一组在演进中逐步收敛整合为当前 system/Commands/Database 下的CreateDatabase、Migrate、MigrateRefresh、MigrateRollback、MigrateStatus、Seed、ShowTableInfo,命令参数与输出格式亦随之迭代。
  • 服务器:Serve,对应当前 system/Commands/Server/Serve.php,即spark serve内置 PHP 开发服务器命令。
  • 会话:CreateMigration(Session 迁移生成),该能力在后续版本中并入通用迁移流程。
  • 工具:Namespaces、Routes,用于在 CLI 中查看已注册命名空间与路由表,当前实现位于 system/Commands/Utilities。

Router:定义式路由 + 自动路由

Router 包包含RouteCollection(路由定义集合)、Router(路由匹配器)及配套接口。从 system/Router/RouteCollection.php 看,RouteCollection是路由定义的注册中心:它维护默认命名空间、默认控制器(Home)、默认方法(index)、默认占位符(any)等属性,并通过add()、group()、resource()等 API 组织 app/Config/Routes.php 中的路由声明。Router(system/Router/Router.php)负责将入站 URI 与定义路由匹配,若未命中则按 alpha.1 时代的约定回退到"自动路由"(Auto Router)机制,当前仓库中对应 system/Router/AutoRouter.php 与 system/Router/AutoRouterImproved.php 两种实现,后者在 app/Config/Routing.php 中通过$autoRoute配置项控制。

HTTP:请求/响应生命周期

HTTP 包是 alpha.1 中规模最大的包,定义了完整的消息模型:IncomingRequest(入站请求)、CLIRequest(CLI 请求)、CURLRequest(出站 HTTP 客户端)、Response/ResponseInterface(响应)、Message(消息基类)、URI(URI 解析)、Header(请求头)、Negotiate(内容协商)、ContentSecurityPolicy(CSP 头生成)、UserAgent(UA 解析),以及Files\FileCollection、Files\UploadedFile等文件上传组件。

当前实现中,system/HTTP/IncomingRequest.php 是 Web 请求的载体,框架核心 system/CodeIgniter.php 在注释中明确自述其职责:"分析请求、路由到控制器、返回响应"。Negotiate负责依据 Accept 头决定响应格式,与 Format 包的 JSON/XML 格式化能力联动。CURLRequest提供基于 cURL 的 HTTP 客户端(composer.json 中ext-curl作为建议扩展列出),是 CI4 不依赖 Guzzle 等外部客户端即可发起外部请求的关键。

Filters:请求级拦截器

Filters 包定义FilterInterface与Filters两个类,构成"在请求进入控制器之前/响应发出之后执行逻辑"的拦截链机制。开发者通过 app/Config/Filters.php 注册过滤器并指定应用范围(before/after/全局/别名/URI 匹配)。alpha.1 确立的这套机制在后续版本中被广泛用于内置能力——当前 system/Filters 下可见 CSRF 防护、CORS、强制 HTTPS、蜜罐、页面缓存、Debug 工具栏、SecureHeaders 等十余个内置过滤器实现,均为该包的实战化产物。

View:视图渲染与模板解析

View 包包含View(PHP 视图渲染器)、Parser(模板语法解析器)、Cell(视图单元)、Filters(视图过滤器)、Plugins(解析器插件)、RendererInterface等。当前 system/View/View.php 实现RendererInterface,通过$data、$tempData管理变量作用域,借助FileLocator定位视图文件,并集成了 Debug 工具栏的视图收集器。Parser提供{placeholder}风格的模板语法,Cell实现"视图组件化"(在视图中调用view_cell()),而Plugins为解析器注册可复用的函数式扩展。相关测试见 tests/system/View。alpha.1 将 ZendEscaper(system/ThirdParty 下现为Escaper)内置为 View 的配套组件,用于视图输出的安全转义。

数据与领域组件包详解

Database:多驱动查询构建与迁移

Database 包是 alpha.1 包清单中的重量级成员,顶层包含BaseBuilder(查询构建器)、BaseConnection(连接基类)、BasePreparedQuery(预处理查询)、BaseResult(结果集)、BaseUtils(工具)、Config、Database(门面)、Forge(表结构操作)、Migration/MigrationRunner(迁移)、Query/QueryInterface、Seeder等,并针对 MySQLi、Postgre、SQLite3 三款驱动提供了各自的 Builder/Connection/Forge/PreparedQuery/Result 实现。

当前仓库的 system/Database 目录完整保留并扩充了这一结构:驱动层在原有 MySQLi、Postgre、SQLite3 基础上新增了 OCI8(Oracle)与 SQLSRV(SQL Server);Forge用于建表/改表(createTable、addColumn等),MigrationRunner驱动spark migrate系列命令,Seeder支撑spark db:seed。Query对象封装 SQL 与绑定参数,支持查询事件触发与调试记录,这一设计延续至当前 system/Database/Query.php。对应测试覆盖于 tests/system/Database。

Cache:统一缓存接口与多后端 Handler

Cache 包定义CacheFactory(工厂)与CacheInterface(接口),Handler 层在 alpha.1 已覆盖 Dummy、File、Memcached、Predis、Redis、Wincache 六种。当前 system/Cache/Handlers 下实现与此一一对应(并新增 ApcuHandler),system/Cache/CacheInterface.php 定义了get、save、delete等统一操作契约,业务代码通过 app/Config/Cache.php 的$handler配置选择后端而无需改动调用逻辑。CacheFactory(system/Cache/CacheFactory.php)负责按配置实例化对应 Handler 并做连接初始化。

Validation:规则驱动的数据校验

Validation 包包含Validation、ValidationInterface及多组规则类:CreditCardRules(信用卡号)、FileRules(文件上传)、FormatRules(格式类,如 email/url/json)、Rules(通用规则)。从源码看,system/Validation/Rules.php 实现required、min_length、max_length、matches、regex_match等基础规则,Validation类(system/Validation/Validation.php)负责规则解析、错误消息生成与跨字段校验,语言包 system/Language/en/Validation.php 提供可国际化的错误文案。后续版本还新增了 system/Validation/StrictRules(严格类型规则集)。测试见 tests/system/Validation。

Format:JSON/XML 格式化与内容协商

Format 包定义FormatterInterface、JSONFormatter、XMLFormatter三个类,负责将数组数据序列化为 JSON 或 XML。当前仓库在接口之上新增了门面类 system/Format/Format.php,其getFormatter(string $mime)方法依据 app/Config/Format.php 中的formatters映射返回对应格式化器,供 HTTP 层的内容协商与 API 响应输出使用——这正与 API 包中ResponseTrait的"根据客户端 Accept 头自动选择 json/xml"能力(见 system/API/ResponseTrait.php)形成闭环。

I18n:时间与本地化

I18n 包在 alpha.1 中仅含Time与TimeDifference。当前 system/I18n/Time.php 基于 PHP 的DateTimeImmutable扩展封装,提供now()、parse()及跨时区、相对时间计算能力;system/I18n/TimeDifference.php 用于计算两个时间点的人类可读差值(如"3 天前")。后续版本在此之上演化出 system/I18n/TimeTrait.php 与兼容旧 API 的 system/I18n/TimeLegacy.php,并依赖ext-intl(见 composer.json)。

Images:图像处理抽象

Images 包包含Image(门面)、ImageHandlerInterface与 Handler 层(Base/GD/ImageMagick)。当前 system/Images/Handlers 下可见 system/Images/Handlers/GDHandler.php 与 system/Images/Handlers/ImageMagickHandler.php,分别依赖ext-gd与ext-imagick(对应 composer.json 的建议扩展)。Image门面统一暴露裁剪、缩放、旋转等操作,Handler 层的可替换设计让应用可在 app/Config/Images.php 中切换驱动。

Session:会话管理与多驱动

Session 包包含Session、SessionInterface及 Handler 层(Base/File/Memcached/Redis)。当前 system/Session/Handlers 在原有四类基础上扩充到八类,system/Session/Session.php 负责与 PHP 原生会话机制的桥接、闪存数据(flashdata)与临时数据(tempdata)管理,Handler 由 app/Config/Session.php 的$driver配置决定。

Security:CSRF 与安全工具

Security 包仅列Security一个类。当前 system/Security/Security.php 实现 CSRF 令牌生成与校验,与 system/Filters/CSRF.php 过滤器配合在表单提交场景落地防护;app/Config/Security.php 提供$csrfProtection、$tokenName、$tokenLength等配置项。

Honeypot:反机器人蜜罐

Honeypot 包同样只有Honeypot一个类(system/Honeypot/Honeypot.php),实现"隐藏表单陷阱字段 + 延时"的反自动化提交策略:正常用户不会填写隐藏字段,而机器人填写的值或过快的提交速度会触发拦截。配置位于 app/Config/Honeypot.php,由 system/Filters/Honeypot.php 过滤器在表单渲染与提交校验阶段挂载。

Throttle:令牌桶限流

Throttle 包包含Throttler与ThrottlerInterface。从源码看,system/Throttle/Throttler.php 明确实现了**令牌桶算法(Token Bucket)**的"滚动窗口"式限流:每个令牌等价于一次请求,令牌补充速率与容量由调用方指定,计数状态存放于CacheInterface后端。这在 API 场景中用于按 IP 或用户维度限制请求频率,ResponseTrait中的too_many_requests(HTTP 429,见 system/API/ResponseTrait.php)即与之呼应。

Email:邮件发送

Email 包仅一个Email类(system/Email/Email.php),提供基于 SMTP、Sendmail、mail() 等多种协议的邮件发送能力,支持 HTML 邮件、附件与邮件队列,配置集中在 app/Config/Email.php。对应测试位于 tests/system/Email。

Pager:分页组件

Pager 包包含Pager、PagerInterface、PagerRenderer。当前 system/Pager/Pager.php 负责从查询字符串解析页码、计算总页数与偏移量,PagerRenderer(system/Pager/PagerRenderer.php)生成可定制的分页链接 HTML,模板位于 system/Pager/Views,通过 app/Config/Pager.php 配置每页条数与模板。

Typography:排版处理

Typography 包仅Typography一个类(system/Typography/Typography.php),提供自动换行、智能引号与段落格式化等文本排版工具,属于辅助性组件。

API 包与响应语义化

API 包在 alpha.1 中仅列出ResponseTrait一个 trait,但它是 CI4 面向 API 开发的标志性组件。当前 system/API/ResponseTrait.php 维护了一张语义化状态码映射表($codes),将created(201)、no_content(204)、unauthorized(401)、forbidden(403)、resource_not_found(404)、too_many_requests(429)等业务语义映射到标准 HTTP 状态码;配合respond()、fail()等便捷方法(见 system/API/ResponseTrait.php 对内容协商的描述),控制器只需声明响应意图即可获得格式一致、状态码规范的 JSON/XML 输出。该 trait 被 system/RESTful/ResourceController.php 等 RESTful 控制器基类复用,是 alpha.1 之后在 RESTful 支持(tests/system/RESTful)上持续演进的起点。

Helpers 与 Test:函数库与测试设施

Helpers包以函数集形式提供(命名不含Helper后缀类),alpha.1 清单列出 array、cookie、date、filesystem、form、html、inflector、number、security、text、url 共十一组。当前 system/Helpers 目录完整保留这些函数文件(如 system/Helpers/array_helper.php、system/Helpers/form_helper.php),并在 system/Common.php 与各 helper 中通过helper()全局函数按需加载。后续新增的 kint、xml、test 等组进一步丰富了函数库。

Test包定义了 CI4 的测试体系:CIUnitTestCase(单元测试基类)、CIDatabaseTestCase(数据库测试基类)、FeatureResponse/FeatureTestCase(功能测试,演进为当前 system/Test/FeatureTestTrait.php)、ReflectionHelper(反射工具),以及Filters\CITestStreamFilter(流拦截过滤器)。当前 tests/system/Test 与 tests/system/DatabaseTestTrait.php 等扩展印证了这一体系的壮大,phpunit.dist.xml 与 composer.json 中的test脚本(phpunit)定义了标准的测试运行入口。

Debug 与内置第三方包

Debug包包含Exceptions(异常处理)、Iterator、Timer(性能计时)、Toolbar(调试工具栏)及Toolbar\Collectors(收集器集)。其中 system/Debug/Timer.php 提供start(name)/stop(name)/getElapsedTime()等 API,用于测量代码段执行耗时;Toolbar在页面底部渲染调试面板,通过收集器展示请求、数据库查询、视图渲染、日志等运行信息(对应 system/Debug/Toolbar/Collectors 下的十余个收集器类),其界面资源位于 admin/css/debug-toolbar。Exceptions体系当前已细化为 system/Debug/ExceptionHandler.php 与 system/Debug/BaseExceptionHandler.php。

ThirdParty包是框架内置的第三方依赖:alpha.1 列出 Kint(调试变量输出,服务于 Debug)、PSR\Log(日志接口,服务于 Log)、ZendEscaper\Escaper(HTML 转义,服务于 View)。当前 system/ThirdParty 下的Escaper、Kint、PSR目录与此对应;同时 composer.json 显示现代版本已改用 Composer 管理laminas/laminas-escaper与psr/log依赖,第三方库逐渐从"源码内置"转向"包管理器管理",这是依赖管理现代化的体现。

从 alpha.1 到 4.x:架构的延续与演进

将 alpha.1 的包清单与当前仓库 system 目录逐项对照,可以清晰看到 CI4 架构的两条主线:

  1. 骨架高度稳定:包划分、命名空间层级(如CodeIgniter\Database\、CodeIgniter\HTTP\、CodeIgniter\View\)、接口/实现分离的范式自 alpha.1 确立后基本未变。alpha.1 中列出的绝大多数类名至今仍可在system/中找到同名实现,说明这份早期清单奠定了 CI4 的长期演进方向。
  2. 细节持续扩充:每个包在后续版本中新增了配套类——Autoloader 多了缓存与接口抽象,Router 分裂出 AutoRouter 系列与属性路由(system/Router/Attributes),Database 新增 Oracle/SQLServer 驱动,HTTP 新增SiteURI、Cors、DownloadResponse等组件,Test 新增Fabricator、DOMParser等设施,并整体演化出 Entity、DataCaster、Publisher、Modules、HotReloader 等全新子系统。相应地,tests/system 下的测试目录与各包一一对应,成为验证框架行为的最直接证据。

对开发者而言,这份变更日志的价值在于:它是一张"CI4 组件地图"——当你需要扩展自动加载、注册自定义命令、编写过滤器、对接缓存后端或构建 API 响应时,可以顺着清单定位到system/下对应的包与类,再借助 user_guide_src/source 下的官方用户指南(含 concepts、general、libraries 等分册)查阅详细用法。alpha.1 虽然只是预览版,但它确立的分层与命名规范,正是今天 CodeIgniter 4 架构可读性、可测试性与可扩展性的根源。

  • 后端
  • Web框架

【免费下载链接】CodeIgniter4

Open Source PHP Framework (originally from EllisLab)

项目地址:https://gitcode.com/gh_mirrors/co/CodeIgniter4
点击查看免费下载
上一篇:终极指南:让旧款Mac重获新生,免费安装最新macOS系统
下一篇:终极指南:BetterNCM安装器如何彻底改变你的网易云音乐体验

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询