后端Web框架【免费下载链接】CodeIgniter4Open Source PHP Framework (originally from EllisLab)项目地址https://gitcode.com/gh_mirrors/co/CodeIgniter4点击查看免费下载本文基于仓库内 v4.0.4 发布记录2020 年 7 月 15 日发布编写逐条解读该版本引入的破坏性变更、新增 CLI 命令、API 增强与 Bug 修复并结合当前仓库源码system/ 目录验证各项能力的实际实现。读完本文你将掌握 4.0.4 升级时必须注意的 Filter 接口变更以及cache:clear、make:seeder、command()、mb_url_title()、hex2bin:加密密钥等新特性的用法与底层原理。版本概览CodeIgniter 4.0.4 是 4.0 系列的第 5 个补丁版本发布于 2020 年 7 月 15 日。该版本以「稳定性 新能力」为主线1 项破坏性变更FilterInterface的before()/after()方法新增$arguments参数所有实现了该接口的自定义过滤器必须同步更新20 余项增强覆盖缓存命令、数据填充Seeder、测试工具Fabricator、Feature Test、URI 与请求处理、图像库WebP 支持、URL 辅助函数、加密密钥格式等20 余项 Bug 修复涉及数据库驱动PostgreSQL、SQLite3、MySQLi、图像处理器GD、ImageMagick、CURLRequest、时间处理等多个模块。完整的 Bug 修复清单可查阅仓库根目录的 changelogs/CHANGELOG_4.0.md。说明本文以 4.0.4 的发布记录为主体文中涉及的源码实现均引自当前仓库已包含后续版本演进个别 API 在后继版本中可能被标记弃用如URI::setSilent()在 4.4.0 起标记deprecated阅读时请结合你实际使用的版本。破坏性变更FilterInterface 新增 $arguments 参数这是 4.0.4 唯一一项破坏性变更也是升级时必须优先处理的事项。FilterInterface中before()与after()两个方法均新增了$arguments参数用于接收在路由或配置中为过滤器声明的参数。当前仓库 system/Filters/FilterInterface.php 中的接口签名如下public function before(RequestInterface $request, $arguments null); public function after(RequestInterface $request, ResponseInterface $response, $arguments null);其中$arguments的类型为liststring|null。该参数的意义在于你在Config\Filters中配置过滤器时声明的参数例如csrf [except [...]], throttle:10,1中的10, 1此前只能用于before()4.0.4 之前无法传递到after()本次变更统一了两个方法的签名并顺带修复了「filter 参数未传递给after()」的 Bug见文末 Bug 修复清单。如何更新你的自定义过滤器任何实现了FilterInterface的类都需要把方法签名补上第三个参数?php namespace App\Filters; use CodeIgniter\Filters\FilterInterface; use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\ResponseInterface; class MyFilter implements FilterInterface { public function before(RequestInterface $request, $arguments null) { // 原有的过滤逻辑 return null; } public function after(RequestInterface $request, ResponseInterface $response, $arguments null) { // 现在可以读取 $arguments 了 // 例如记录审计日志、修改响应头等 return $response; } }更新完成后在 app/Config/Filters.php 中为过滤器声明的参数即可在两个阶段同时生效便于实现「前后端参数一致的过滤器」。新增 CLI 命令cache:clear 与 make:seedercache:clear一键清空缓存4.0.4 新增了cache:clear命令用于销毁当前缓存引擎中的全部数据。其实现位于 system/Commands/Cache/ClearCache.php核心逻辑$config config(Cache::class); $handler $params[0] ?? $config-handler; // 可指定缓存驱动默认取配置用法php spark cache:clear # 清空默认驱动Config\Cache 中 handler 指定的驱动 php spark cache:clear file # 显式指定清空 file 驱动 php spark cache:clear redis # 清空 redis 驱动命令执行细节驱动名必须存在于Config\Cache的validHandlers中否则输出Cache.invalidHandler错误并返回EXIT_ERROR实际清空操作调用service(cache, $config)-clean()若使用file驱动且文件定位器是缓存版FileLocatorCached还会顺带删除定位器自身的缓存文件system/Autoloader/FileLocatorCached.php保证类文件搜索缓存同步失效成功时输出绿色Cache cleared.。make:seeder生成数据填充骨架配套新增make:seeder命令用于生成 Database Seed 类骨架文件实现位于 system/Commands/Generators/SeederGenerator.phpphp spark make:seeder User php spark make:seeder User --suffix # 生成 UserSeeder类名追加 Seeder 后缀 php spark make:seeder Admin --namespace App\Seeders # 指定命名空间 php spark make:seeder User --force # 覆盖已存在文件生成的文件模板可在 system/Commands/Generators/Views 中查看之后便可用php spark db:seed UserSeeder执行填充相关概念详见 user_guide_src/source/dbmgmt/seeds.rst。command() 辅助函数程序化运行 CLI 命令4.0.4 引入了全局辅助函数command()允许你在控制器、测试或定时任务中像在命令行一样调用框架命令实现在 system/Common.php// 等价于在终端执行 php spark migrate:create SomeMigration command(migrate:create SomeMigration); // 支持带引号的参数 command(make:seeder My Seeder); // 在 Feature Test 中配合使用 $result command(cache:clear);其底层实现参考了 SymfonyStringInput::tokenize()的思路先按空格、引号对输入字符串做分词再解析参数与选项--xxx、-x最终调用Console::run()执行。返回值通常是命令的输出字符串若命令返回错误码则为false。该函数非常适合在 Feature Test 中验证命令行为或在定时任务cron job脚本中复用框架命令能力。测试体验升级Fabricator、Feature Test 与 Model 运行时回调Fabricator可重复的模拟数据工厂4.0.4 正式引入 Fabricator用于在测试中快速、可重复地生成符合模型/实体定义的数据替代手写 mock 数组。它通过与模型定义的字段和验证规则联动为每个字段生成合理的测试数据显著降低测试夹具的维护成本。Feature Test 整体改进该版本对 Feature Test 做了一系列打磨相关文档见 user_guide_src/source/testing/feature.rst例如fetchGlobal()支持数组过滤、file验证支持数组文件等详见下文使端到端式的 HTTP 测试更贴近真实请求。Model 回调支持运行时覆盖Model类的回调如beforeInsert、afterUpdate等可参阅 system/BaseModel.php现在可以在运行时被覆盖。这对测试尤其有用例如在测试中替换回调行为以模拟特定条件而无需修改模型类本身。数据库相关增强与修复SQLite3 默认存储位置调整4.0.4 将 SQLite3 数据库文件的默认位置从public目录迁移到writable目录。这是一个「增强 修复」的组合项数据库文件属于运行时写入的数据放在publicWeb 根目录可能被直接下载、暴露敏感数据而writable目录默认禁止 Web 访问且更适合持久化。升级后项目应检查 app/Config/Database.php 中 SQLite3 连接的database路径配置将默认值指向writable目录下的文件如WRITEPATH . db.sqlite3。getFieldData() 返回字段类型与长度数据库结果类Result的getFieldData()现在返回每个字段的类型type和长度length。以 MySQLi 驱动为例其实现位于 system/Database/MySQLi/Result.php通过静态类型映射表把MYSQLI_TYPE_*常量转换为可读字符串$dataTypes [ MYSQLI_TYPE_DECIMAL decimal, MYSQLI_TYPE_FLOAT float, MYSQLI_TYPE_DOUBLE double, MYSQLI_TYPE_TIMESTAMP timestamp, MYSQLI_TYPE_DATE date, MYSQLI_TYPE_BLOB blob, // ... ];其余驱动Postgre、SQLite3、SQLSRV、OCI8也实现了getFieldData()。典型使用场景$fields $db-query(SELECT * FROM users)-getFieldData(); foreach ($fields as $field) { echo $field-name . : . $field-type . ( . $field-length . ); }PostgreSQL 相关修复补全 FULL OUTER JOIN 支持Postgre 构建器system/Database/Postgre/Builder.php新增 full outer join 支持主键为 null 时的插入修复修复了 Postgres Entity 在插入时主键为null的处理逻辑is_unique/is_not_unique修复通过 API 以 POST/PUT 方式在 PostgreSQL 上调用is_unique、is_not_unique验证规则时不再出错实现位于 system/Validation/Rules.php 与 system/Validation/StrictRules/Rules.php。其他数据库修复修复 SQLite3 数据库的转义字符escape character处理问题修复Model类中结果对象result object的处理逻辑。请求、URI 与安全增强fetchGlobal() 支持数组数据过滤Request类实际实现在 system/HTTP/RequestTrait.php的fetchGlobal()方法现在可以对数组数据进行过滤而不再局限于首项。查看源码可以发现当$index null时它会遍历整个全局数组并逐个应用filter_var当传入数组形式的$index如users[][name]数组标记或$index本身是数组时也会递归地对每个元素应用过滤器// 对整个 $_POST 数组应用过滤器 $request-fetchGlobal(post, null, FILTER_SANITIZE_STRING); // 取多个键并逐个过滤 $request-fetchGlobal(post, [email, name], FILTER_SANITIZE_STRING);file 验证支持数组文件file验证规则现在可以作用于文件数组多文件上传场景配合max_size、ext_in等规则可对批量上传的每个文件进行校验。URIsetSilent() 与 getSegment() 默认值URI 类新增setSilent()方法system/HTTP/URI.php调用后访问不存在的 URI 段时不再抛出异常而是优雅降级$uri new \CodeIgniter\HTTP\URI(https://example.com/a/b); $uri-setSilent(); echo $uri-getSegment(5); // 不抛异常返回默认值 同时getSegment()新增第二个参数$defaultsystem/HTTP/URI.php允许自定义「段不存在时返回的默认值」// 第 3 段不存在时返回 home而不是抛异常或返回空串 echo $uri-getSegment(3, home);注意setSilent()在 4.4.0 起被标记为deprecated不在 PSR-7 中新代码建议优先使用getSegment()的默认值参数。加密密钥支持 hex2bin: 前缀Encryption类的$key参数及.env中的encryption.key现在支持hex2bin:前缀用于以十六进制形式书写二进制密钥。解析逻辑位于 system/Config/BaseConfig.phpif (str_starts_with($key, hex2bin:)) { return hex2bin(substr($key, 8)); } if (str_starts_with($key, base64:)) { return base64_decode(substr($key, 7), true); }.env中的写法示例# 十六进制编码的密钥 encryption.key hex2bin:0123456789abcdef... # 或 base64 编码的密钥GenerateKey 命令默认格式 encryption.key base64:rL0C4...配套的密钥生成命令php spark key:generate --prefix hex2bin会输出hex2bin:开头的密钥见 system/Commands/Encryption/GenerateKey.php。更多说明见 user_guide_src/source/libraries/encryption.rst。路由与安全杂项路由正则支持 UnicodeRouter层的正则表达式增加了 Unicode 支持匹配多语言/中文路由参数更可靠force_https()修复修复了force_https()可能重复添加https://前缀的 Bug相关过滤器位于 system/Filters/ForceHTTPS.php默认 .htaccess 更新默认.htaccess文件更新更好地兼容扩展字符如带重音符号的文件名、UTF-8 路径。图像处理增强WebP 支持与 withResource()WebP 格式支持Image 库system/Images/Image.php新增webp图片类型支持GD 处理器system/Images/Handlers/GDHandler.php通过imagewebp()导出、imagecreatefromwebp()读取 WebPImageMagick 处理器system/Images/Handlers/ImageMagickHandler.php需要服务器安装支持WEBP格式的 ImageMagick否则抛出webpNotSupported异常基础类型白名单同步加入IMAGETYPE_WEBPsystem/Images/Handlers/BaseHandler.php。withResource()方法链压缩BaseHandler新增withResource()system/Images/Handlers/BaseHandler.php用于加载处理过程中的临时图像资源避免直接调用内部getResource()。官方用途是「只做压缩」时以方法链方式调用$image-withFile(photo.webp) -withResource() -compress(80); // 加载资源后直接压缩不修改原图元数据图像相关 Bug 修复Image::save()在$target参数为null时的保存 BugGD 处理器在某些情况下会重复压缩图像的 BugImageMagick 处理器的多项稳定性改进。URL 与文件系统辅助函数mb_url_title()多字节安全的 URL 标题新增 mb_url_title() 辅助函数功能类似url_title()但会先通过convert_accented_characters()转换带重音/特殊字符如é、ñ、中文拼音的字符再生成 URL 友好的标题。实现位于 system/Helpers/url_helper.phpfunction mb_url_title(string $str, string $separator -, bool $lowercase false): string { helper(text); return url_title(convert_accented_characters($str), $separator, $lowercase); }用法示例echo mb_url_title(Café au lait); // cafe-au-lait echo mb_url_title(über größe, _, true); // uber_grosse依 ForeignCharacters 映射delete_files() 支持删除隐藏文件夹delete_files()辅助函数新增第四个参数$hiddensystem/Helpers/filesystem_helper.php开启后允许递归删除以.开头的隐藏文件/目录// 删除 $path 下所有文件含 .htaccess、index.html 之外的隐藏文件 delete_files(/path/to/cache, false, false, true);源码中通过$filename[0] .判断隐藏文件$hidden为false时跳过保持原有安全行为为true时纳入删除范围。响应与重定向增强withCookies() 与 withHeaders()4.0.4 为RedirectResponse新增withCookies()与withHeaders()方法实现见 system/HTTP/RedirectResponse.php用于在重定向时复制全局Response对象上已经设置的 Cookie 与 Header避免重定向响应丢失这些内容return redirect()-to(/dashboard) -withCookies() // 复制全局 Response 的 Cookie 到本次重定向 -withHeaders(); // 复制全局 Response 的 Header 到本次重定向实现细节withCookies()直接以全局 Response 的 Cookie 集合重建本响应的CookieStorewithHeaders()遍历service(response)-headers()按单值 Header / 多值 Header 分别调用setHeader()/addHeader()。配套修复使用自定义 HTTP 状态码进行重定向如redirect()-withStatus(301)现在也能正确工作。其他增强与修复汇总开发体验类Windows 下的 CLI 颜色支持CLI 输出颜色在 Windows 终端可用并附带多项 Windows 相关 CLI 改进CLI 参数支持短横线CLI 脚本现在能正确识别参数中的短横线-例如值形如my-value的参数不再被误解析为选项CURLRequest 修复修复可能产生错误的 100 Continue 请求头的问题multipart 数据现在能正确设置 Content-LengthEntity 相关修复fill()过程中数组、JSON 等 cast 项设置不正确的问题保存 JSON 时不再转义 Unicode 字符。表单与时间类修复set_checkbox()/set_radio()在$default为true时的选中状态问题修复Time::setTimezone()工作异常的问题相关类见 system/I18n/Time.php。本地化与验证修复翻译输出逻辑确保在指定 locale、带短横线 locale如zh-CN以及 fallback 为en时都能正确返回翻译修复在配置文件Config 文件中设置验证错误validation errors不生效的问题。升级到 4.0.4 的检查清单综合以上内容从 4.0.3 或更早版本升级到 4.0.4 时建议按以下顺序核对适配破坏性变更为所有实现FilterInterface的类补充$arguments参数before()与after()都要改检查 SQLite3 数据库路径确认 app/Config/Database.php 中 SQLite3 默认路径指向writable目录并把已有数据库文件从public迁移过去验证加密密钥若使用.env中的encryption.key可选用hex2bin:前缀格式用php spark key:generate重新生成密钥时注意前后缀一致回归测试过滤器与重定向重点测试携带参数的过滤器、force_https()、自定义状态码重定向以及withCookies()/withHeaders()场景善用新命令将cache:clear接入部署/CI 流程用make:seeder快速搭建数据填充骨架用command()在定时任务中复用框架命令。4.0.4 在保持 API 稳定的前提下通过这轮「过滤器参数透传 命令补齐 图像/加密/URI 能力扩展 数据库与测试修复」为 4.0 系列后续版本奠定了更扎实的基础。完整的逐条 Bug 列表仍以 changelogs/CHANGELOG_4.0.md 为准本文对应的原始发布记录见 user_guide_src/source/changelogs/v4.0.4.rst。赞分享后端Web框架【免费下载链接】CodeIgniter4Open Source PHP Framework (originally from EllisLab)项目地址https://gitcode.com/gh_mirrors/co/CodeIgniter4点击查看免费下载相关推荐Apache Beam 2.22.0 版本解读新 I/O、关键特性增强与一项破坏性变更详解Apache Beam 2.22.0 版本解读新 I/O、关键特性增强与一项破坏性变更详解 本文基于 Beam 官方发布博客 beam 2.22.0.md h批处理流处理大数据CodeQL C 库 0.12.0 版本更新全解析破坏性变更、新污点模型与安全查询增强CodeQL C 库 0.12.0 版本更新全解析破坏性变更、新污点模型与安全查询增强 0.12.0 是 CodeQL C 查询库 cpp/ql/l静态分析SAST应用安全漏洞扫描代码质量CodeIgniter 4.5 版本深度解析从 v4.5.0 到 v4.5.8 的破坏性变更、新特性与修复全指南CodeIgniter 4.5 版本深度解析从 v4.5.0 到 v4.5.8 的破坏性变更、新特性与修复全指南 本篇文章以 CodeIgniter 4 官方后端Web框架上一篇openEuler/oec-application高级技巧提升应用兼容性测试效率的5个实用方法下一篇openEuler hotpatch_meta多架构支持如何为x86_64和aarch64制作跨平台热补丁创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考