CodeIgniter4 4.5.0 版本发布说明深度解析:Required Filters、spark optimize 与关键破坏性变更

发布时间:2026/10/10 5:25:15

CodeIgniter4 4.5.0 版本发布说明深度解析:Required Filters、spark optimize 与关键破坏性变更 后端Web框架【免费下载链接】CodeIgniter4Open Source PHP Framework (originally from EllisLab)项目地址https://gitcode.com/gh_mirrors/co/CodeIgniter4点击查看免费下载CodeIgniter 4 于 2024 年 4 月 7 日发布了 4.5.0 版本原始发布说明见 v4.5.0.rst。本版本将最低 PHP 要求提升至 8.1、最低 PHPUnit 要求提升至 10.5并引入了 CORS 过滤器、spark optimize生产优化命令和“Required Filters必需过滤器”机制。读完本篇你将完整掌握 4.5.0 的全部新增能力、破坏性变更清单与升级注意事项并结合仓库源码理解每项变更的落地实现。版本亮点Highlights4.5.0 的四个核心亮点最低 PHP 版本要求更新为 8.1最低 PHPUnit 版本要求更新为 10.5CORS 过滤器新增跨域资源共享过滤器与Cors类为前后端分离场景提供框架级 CORS 支持spark optimize命令一键为生产环境做配置优化是 4.5.0 面向性能的重要工具。CORS 过滤器的源码实现CORS 能力由 system/HTTP/Cors.php 中的核心类与 system/Filters/Cors.php 过滤器共同提供。核心类支持以下配置项默认值见源码第 37–45 行配置项类型默认值说明allowedOriginsliststring[]允许的源白名单allowedOriginsPatternsliststring[]源的正则模式匹配supportsCredentialsboolfalse是否允许携带凭证allowedHeadersliststring[]允许的请求头exposedHeadersliststring[]暴露给浏览器的响应头allowedMethodsliststring[]允许的 HTTP 方法maxAgeint7200预检请求缓存时长秒应用层的配置入口是 app/Config/Cors.php过滤器在 app/Config/Filters.php 的$aliases中注册为cors可像其他过滤器一样挂到全局或指定路由上。spark optimize生产环境一键优化spark optimize的实现位于 system/Commands/Utilities/Optimize.php。从源码看run()方法依次执行三步第 60–73 行enableCaching()通过Publisher::replace()把 app/Config/Optimize.php 中的$configCacheEnabled与$locatorCacheEnabled两个开关从false替换为true开启配置缓存Factories Cache与 FileLocator 文件定位缓存clearCache()删除FileLocatorCached缓存及WRITEPATH . cache/FactoriesCache_config缓存文件确保新会话重新生成removeDevPackages()切到项目根目录执行composer install --no-dev移除开发依赖。注意 app/Config/Optimize.php 类注释中的两个约束该类故意不继承BaseConfig出于性能考虑因此不能用环境变量覆盖其属性值且在 Worker Mode 下不应启用这些优化选项。增强功能EnhancementsRequired Filters必需过滤器4.5.0 引入了 Required Filters 机制它们是特殊的过滤器在其他所有过滤器之前/之后执行并且即使路由不存在也一定会执行。app/Config/Filters.php 中的$required属性即其配置入口public array $required [ before [ forcehttps, // Force Global Secure Requests pagecache, // Web Page Caching ], after [ pagecache, // Web Page Caching performance, // Performance Metrics toolbar, // Debug Toolbar ], ];以下既有功能被重新实现为 Required FiltersForce Global Secure Requests强制 HTTPSWeb Page Caching页面缓存Performance Metrics性能指标收集Debug Toolbar调试工具栏。在框架主循环 system/CodeIgniter.php 中required_before_filters基准点在第 352 行启动随后runRequiredBeforeFilters()调用$filters-runRequired(before)第 394–397 行响应阶段则通过runRequiredAfterFilters()执行runRequired(after)。基准Benchmark计时点随之调整Debug Toolbar 现在会收集 Required Before/After Filters 的数据变更前Beforebootstrap创建 Request/Response 对象、触发pre_system事件、实例化 RouteCollection、加载路由文件、实例化 Routerrouting执行路由匹配变更后Afterbootstrap创建 Request/Response 对象、触发pre_system事件required_before_filters实例化 Filters 对象、运行 Required Before Filtersrouting实例化 RouteCollection、加载路由文件、实例化 Router、执行路由匹配。路由Routing增强AutoRouting Improved 新增$translateUriToCamelCase选项允许使用 CamelCase 风格的控制器与方法名例如blog-controller映射到BlogController。该选项位于 app/Config/Routing.php当前 starter 配置默认值为true启用后$translateURIDashes将被忽略其实现见 system/Router/AutoRouterImproved.php 第 129 行对配置项的读取。新增$multipleSegmentsOneParam选项app/Config/Routing.php默认false启用后(:any)这类可匹配多段的占位符会把整段内容原样作为单个参数传递即使其中包含多个 URI 段。相关判断逻辑见 system/Router/Router.php 第 530 行。$override404增强$override404指定的 404 控制器的方法现在会把PageNotFoundException的消息字符串作为第一个参数传入方便自定义 404 页面输出原因。__invoke()可作为默认方法控制器未显式指定路由方法时除了index外还可定义__invoke()方法作为入口。新增 Spark 命令命令作用实现位置spark optimize为生产环境优化配置开启缓存、清缓存、移除 dev 包system/Commands/Utilities/Optimize.phpspark make:test生成测试文件骨架system/Commands/Generators/TestGenerator.phpspark config:check检查 Config 中的配置值是否被正确使用system/Commands/Utilities/ConfigCheck.phpspark phpini:check检查关键 PHP ini 设置system/Commands/Utilities/PhpIniCheck.phpspark lang:find扫描代码并更新翻译键system/Commands/Translation/LocalizationFinder.php另外spark db:table命令新增了--dbgroup选项允许指定要查看的数据库组。测试Testing增强DOMParser新增seeXPath()与dontSeeXPath()方法可以直接使用复杂的DOMXPath表达式断言页面结构CLI新增InputOutput类system/CLI/InputOutput.php配合MockInputOutput后可以更轻松地编写 Spark 命令的测试Fabricator新增setUnique()、setOptional()、setValid()三个方法允许在伪造字段值之前调用 Faker 的相应修饰器unique()、optional()、valid()见 system/Test/Fabricator.phpTestResponse不再继承PHPUnit\Framework\TestCase因为它本身不是测试用例断言方法的返回类型改为原生void。数据库DatabaseQuery Builderlimit(0)行为修复特性开关SQL 语义中LIMIT 0应返回 0 条记录但 Query Builder 存在历史缺陷调用limit(0)时生成的 SQL不带LIMIT子句会返回全部记录。4.5.0 引入特性开关Feature::$limitZeroAsAll来修复这一行为开关定义在 app/Config/Feature.php/** * The behavior of limit(0) in Query Builder. * * If true, limit(0) returns all records. (the behavior of 4.4.x or before in version 4.x.) * If false, limit(0) returns no records. (the behavior of 3.1.9 or later in version 3.x.) */ public bool $limitZeroAsAll true;当前默认值仍为true保持旧行为但官方建议将其设为false因为未来版本将默认修复该错误行为。其他新增对**数据库名中包含句点.**的支持。Model 增强字段类型转换Field Casting新增把从数据库取出的数据自动转换为合适 PHP 类型的功能配合DataCaster如 system/DataCaster/DataCaster.php 与 system/Entity/Cast 中的各类 CastfindAll(0)行为与 Query Builder 的limit(0)修复共用Feature::$limitZeroAsAll开关。关闭该开关后原本findAll(0, $offset)这类“取全部并带偏移”的写法需要改为findAll(null, $offset)$updateOnlyChanged属性控制更新 Entity 时是否只更新发生变化的字段。设为false后即使 Entity 值未变化更新时也不会抛出DataExceptionThere is no data to update保存日期格式化保存Time实例到数据库时可以自定义日期/时间格式$dateFormat例如datetime/date/timestamp。库Libraries增强CORS新增 app/Config/Cors.php 配置类与 CORS 过滤器/核心类见上文“CORS 过滤器的源码实现”Validation新增field_exists规则校验被验证数据中某字段是否存在区别于值校验。其实现位于 system/Validation/Rules.php普通字段用array_key_exists()判断含.的点号字段则委托ArrayHelper::dotKeyExists()判断嵌套键是否存在。严格模式StrictRules下另有同名实现Validation::run()的$dbGroup参数现在除数据库组名字符串外还接受数据库连接实例或数据库配置数组SessionRedisHandler现在可配置获取锁的间隔时间$lockRetryInterval与重试次数$lockMaxRetries并支持Redis ACL同时提供用户名与密码SecurityConfig\Security::$redirect现在按环境区分默认值——生产环境为true其他环境仍为false即生产环境下 CSRF 验证失败会直接重定向防止令牌在错误页面泄露。其他OthersBootstrap引入CodeIgniter\Boot类system/Boot.php替代原system/bootstrap.php文件Autoloader使用 Composer 时的自动加载性能得到提升在composer.json的autoload.psr4中加入App命名空间也可能进一步改善应用性能实现FileLocator 缓存system/Autoloader/FileLocatorCached.php并新增 FileLocatorInterface 接口CodeIgniter视图文件中新增伪变量{memory_usage}用于显示内存占用该特性在 CodeIgniter 3 中曾有支持Events新增pre_command与post_command事件点用于 Spark 命令执行前后HTTP新增Message::addHeader()方法system/HTTP/Message.php允许添加与已有头同名的另一个请求/响应头Web Page CachingResponseCachesystem/Cache/ResponseCache.php改进缓存键中加入了 HTTP 方法——同一 URI 在 GET/POST 等不同方法下会分别缓存CSP新增ContentSecurityPolicy::clearDirective()方法可清除已存在的 CSP 指令。破坏性变更BREAKING行为变更1. HTTP 方法名统一为大写出于历史原因框架过去使用小写 HTTP 方法名get、post。由于方法 token 可能被用作对象方法名的入口且区分大小写而标准方法名按 RFC 9110 约定为全大写 US-ASCII因此 4.5.0 起Request::getMethod()返回大写的 HTTP 方法CURLRequest::request()不再把接受的 HTTP 方法转为大写。配套地RouteCollection受保护属性$routes中的 HTTP 方法键已从 lowercase 修正为 uppercaseFilters接受小写方法键、spark filter:check接受小写方法、RouteCollection::match()/setHTTPVerb()接受小写方法、FeatureTestTrait::call()/withRoutes()接受小写方法等兼容行为均被弃用请改用大写。2. Controller 过滤器执行顺序变化Controller Filters 的执行顺序发生了调整可通过Config\Feature::$oldFilterOrder true临时回退到 4.4 及之前的顺序该开关见 app/Config/Feature.php。3. 嵌套路由组与选项合并一个 bug 修复带来行为变化传给外层group()的选项现在会与内层group()的选项合并而不是被内层覆盖。4. API\ResponseTrait当响应格式为 JSON 时如果传入字符串数据框架现在返回JSON 响应此前版本返回 HTML 响应。5. Factories 类变为 finalsystem/Config/Factories.php 改为 final 静态类。它本来就是静态类即使被继承也无法真正替换因此收紧为 final 无实际影响。其他行为变更AutoRouting Legacy请求 URI 对应的控制器不存在时现在抛出PageNotFoundExceptionLoggerlog_message()函数与CodeIgniter\Log\Logger的日志方法不再返回bool返回类型修正为void以符合 PSR-3AutoloaderFileLocator::findQualifiedNameFromPath()返回的全限定类名去掉了前缀\BaseModelgetIdValue()方法改为abstractRouting404-override 功能现在默认把 Response 状态码改为 404system/bootstrap.php该文件不可再使用相关代码已迁移到CodeIgniter\Boot类。接口变更Interface Changes前提说明只要你没有继承相关核心类或实现这些接口以下变更全部向后兼容无需处理。ResponseInterfacesetCookie()第三个参数$expire的默认值从修正为0Loggerpsr/log包升级至 v3.0.0ValidationValidationInterface::run()的方法签名变更$dbGroup参数移除了?string类型提示。方法签名变更Method Signature Changes设置 Cookieset_cookie()与Response::setCookie()的第三个参数$expire类型从string改为int默认值从改为0FileLocatorInterfaceRouteCollection构造函数的第一个参数、View构造函数的第三个参数类型从FileLocator放宽为FileLocatorInterfaceModelModel与BaseModel中objectToRawArray()的返回类型从?array收紧为array传统 Validation 规则为给框架代码库添加declare(strict_types1)FormatRules与Rules中所有传统规则的待校验值参数类型?string被移除例如Before: public function integer(?string $str null): bool After: public function integer($str null): boolLogger实现 PSR-3 接口的日志方法返回类型由bool改为void$message参数类型为string|Stringable。移除的弃用项Removed Deprecated Items模块移除项RequestgetMethod()的$upper参数isValidIP()IncomingRequest的$enableCSRF属性与removeRelativeDirectory()方法Request::$proxyIPs属性$uri、$config改为 protectedFiltersFilters::enableFilter()、RouteCollection::getFilterForRoute()、Router::$filterInfo、Router::getFilter()多个过滤器现已始终启用DatabaseModelFactoryModelBaseModel::idValue()、BaseModel::fillPlaceholders()、Model::idValue()、Model::classToArray()ResponseResponseTrait::$CSP改为 protected移除$CSPEnabled、$cookiePrefix、$cookieDomain、$cookiePath、$cookieSecure、$cookieHTTPOnly、$cookieSameSite、$cookies等弃用属性SecurityisExpired()、CSRFVerify()、getCSRFHash()、getCSRFTokenName()、sendCookie()、doSendCookie()CodeIgniter$path、$useSafeOutput、useSafeOutput()、setPath()TestCIDatabaseTestCase、ControllerResponse、ControllerTester、FeatureResponse、FeatureTestCase、Mock\MockSecurityConfigSpark 命令migrate:create、session:migration其他Cache\Exceptions\ExceptionInterface、Config\Config类、BaseService::discoverServices()、Controller::loadHelpers()、Exceptions\CastException、CodeIgniter\Entity改用CodeIgniter\Entity\Entity、常量SPARKED消息变更Message Changes新增CLI.generator.className.test消息配合spark make:test新增Validation.field_exists错误消息配合新验证规则。其他变更ChangesBootstrap.env的加载与ENVIRONMENT常量的定义被移到bootstrap.php加载之前ConfigConfig\Feature::$multipleFilters被移除因为多过滤器功能现在始终启用生产环境默认错误级别app/Config/Boot/production.php改为E_ALL ~E_DEPRECATED与生产环境的默认 php.ini 对齐RouteCollection受保护属性$routes的 HTTP 方法键从 lowercase 修正为 uppercaseExceptions移除未使用的AlertError与EmergencyError类ForgeSQLSRV Forge 现在把ENUM数据类型转换为VARCHAR(n)此前转换为已在 SQL Server 中弃用的TEXTstrict_types框架代码库的大部分文件添加了declare(strict_types1)。弃用DeprecationsServicesBaseService::$services属性弃用不再使用CodeIgniterdeterminePath()、resolvePlatformExtensions()迁至CodeIgniter\Boot::checkMissingExtensions()、bootstrapEnvironment()迁至CodeIgniter\Boot::loadEnvironmentBootstrap()、initializeKint()/autoloadKint()/configureKint()迁至Autoloader均弃用Response构造参数$config弃用Filters / RouteCollection / FeatureTestTrait接受小写 HTTP 方法键的相关兼容行为弃用请使用大写方法名DatabaseBaseConnection::$strictOn弃用未来将迁入MySQLi\Connection。Bug 修复完整的 bug 修复清单见仓库根目录的 CHANGELOG.md其中按 PR 列出了 4.5.0 周期的全部修复记录。升级 4.5.0 的行动清单综合以上变更升级前建议按序确认环境PHP ≥ 8.1PHPUnit ≥ 10.5代码搜索小写 HTTP 方法比较get/post字面量、set_cookie()/setCookie()第三参数字符串用法、limit(0)/findAll(0)的“取全部”依赖若依赖findAll(0, $offset)语义改为findAll(null, $offset)并评估Feature::$limitZeroAsAll false若自定义了 CSRF 失败行为注意生产环境Config\Security::$redirect默认值已变为true若依赖 Controller 过滤器旧执行顺序可临时启用Config\Feature::$oldFilterOrder true部署时移除对system/bootstrap.php的直接引用并可在生产环境执行php spark optimize开启配置缓存与定位缓存、清理开发依赖。赞分享后端Web框架【免费下载链接】CodeIgniter4Open Source PHP Framework (originally from EllisLab)项目地址https://gitcode.com/gh_mirrors/co/CodeIgniter4点击查看免费下载相关推荐kOps 1.28 发布说明解读Node Termination Handler 默认启用与关键破坏性变更kOps 1.28 发布说明解读Node Termination Handler 默认启用与关键破坏性变更 本文围绕 kOps 1.28 系列官方发布说明云原生集群管理运维IaCPresto Release 0.210 版本发布说明连接器、JDBC 驱动与 SPI 关键变更深度解析Presto Release 0.210 版本发布说明连接器、JDBC 驱动与 SPI 关键变更深度解析 导读 本文基于当前仓库中的官方发布说明 releas大数据数据库后端Robot Framework 4.0.1 版本发布说明与关键修复深度解析Robot Framework 4.0.1 版本发布说明与关键修复深度解析 Robot Framework 4.0.1 是 4.0.x 系列的首个缺陷修复版本测试RPA接口测试上一篇OpCore-Simplify 一键生成 OpenCore EFI15 分钟从硬件报告到可启动 U 盘下一篇Bernini-R核心功能全解析文本生成视频、图像编辑、视频风格迁移的10个实用案例创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/10 6:30:17

火车票订票系统实战:从压缩包到高并发防超卖与订单状态机

简介:这是一份基于C实现的火车票订票系统项目源码,面向正在学习C面向对象编程、数据结构与文件操作的高校学生及自学者,可用于课程设计、实训作业或编程练习参考。系统覆盖查询火车信息、增加火车信息(含重复校验)、打…

2026/10/10 6:30:17

单片机毕设选题推荐:基于单片机的实验室大气参数与空气质量安全监测装置设计 基于单片机的室内气压异常与空气污染联动声光报警系统设计(030107)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/10/10 6:30:17

微信小程序车位预约系统源码解析:SSM后端与数据库还原实战

简介:这份资源面向计算机相关专业学生与微信小程序开发者,提供一套完整的车位预约系统实现方案,可用于课程设计、毕业设计或小程序开发练手。压缩包共8个文件,约45.09MB,包含3个doc说明文档、2个rar源码与录像压缩包、…

2026/10/10 6:30:17

AI编程工具知识沉淀指南:Cursor与Claude Code规则文件搭建

最近和几个朋友维护一个面向 AI 编程工具的交流群,发现一个重复出现很多次的现象:有人分享“我用 Cursor 一口气重构了三个模块”,有人发“Claude Code 把现有项目结构读得一团糟”,还有人问“同一个需求,为什么别人写…

2026/10/10 6:30:17

Spring Boot实战:基于MySQL的CRUD接口开发与分层架构

这套 Spring Boot 系列的第 2 课,我们直接进入正题:用 Spring Boot 从数据库里把增删改查(CRUD)做出来。上一课我的目标是帮大家把工程跑起来,能在浏览器里看到一个 Hello World;这一课开始,你写…

2026/10/10 6:25:17

机器学习驱动的恶意加密流量监测:从特征到决策

简介:基于机器学习的恶意加密流量监测平台项目资料,面向信息安全、人工智能及相关专业的毕业设计、课程设计与初期课题立项,可用于恶意流量识别、加密流量分析、入侵检测等方向的完整方案复现。压缩包内共有68个文件,整体约1.1MB&…

2026/10/8 10:03:18

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/9 20:15:56

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 0:04:53

从逻辑门到计算机:数字电路核心原理与全加器搭建实战

如果你拆过一台旧电脑的主板,盯着那些黑乎乎的小芯片看上一会儿,可能会冒出同一个疑问:这堆引脚密集的元件,到底是怎么“变”出那么复杂的应用的?答案并不在某个神秘的部件里,而是在所有芯片内部都在反复使…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑