资讯详情

CodeIgniter4 CLIRequest 类详解:命令行请求对象与参数访问器完整指南

📅 2026/10/10 2:30:22 | 华诺云谱 👁 阅读
CodeIgniter4 CLIRequest 类详解:命令行请求对象与参数访问器完整指南
后端Web框架【免费下载链接】CodeIgniter4Open Source PHP Framework (originally from EllisLab)项目地址https://gitcode.com/gh_mirrors/co/CodeIgniter4点击查看免费下载本文基于 CodeIgniter4 官方文档 CLIRequest Class 页面 编写系统讲解当请求来自命令行如php spark或php index.php时框架使用的CLIRequest请求类它相对于常规 HTTP 请求新增了哪些访问器方法、各方法的返回值与典型用法以及底层参数解析的实现原理帮助你在编写 CLI 命令、控制器时正确读取路径段与命令行选项。CLIRequest 是什么命令行下的请求对象当请求来自命令行调用时请求对象实际是一个 CLIRequestCodeIgniter\HTTP\CLIRequest它继承自Request基类行为与常规请求IncomingRequest相同但额外提供了一批便于读取命令行输入的访问器方法。类的头注释明确说明其设计意图Represents a request from the command-line. Provides additional tools to interact with that request since CLI requests are not static like HTTP requests might be.框架在启动时决定使用哪种请求对象。从 核心入口类 的getRequestObject()方法可以看到if ($this-isPhpCli()) { Services::createRequest($this-config, true); // CLI 环境下创建 CLIRequest } else { Services::createRequest($this-config); // Web 环境下创建 IncomingRequest }CLIRequest的构造函数还做了几件关键的事见 构造函数实现通过is_cli()校验非命令行环境下实例化会抛出RuntimeException调用ignore_user_abort(true)避免 TTY 断开时脚本直接终止调用parseCommand()解析argv得到 segments 与 options用getPath()的结果构造SiteURI对象使siteURI()等 API 在 CLI 场景下也能工作。CLIRequest内部维护三个核心属性见 属性定义属性类型含义$segmentsliststring命令行中构成“路径”的参数段$optionsarraystring, bool\|string命令行选项及其值$argsarrayarray-key, bool\|string全部命令行参数segments 与 options 的合集$methodstring固定为CLI替代 HTTP 动词核心规则命令行参数如何划分成路径与选项理解CLIRequest的关键在于它划分参数的规则把命令行参数当作 URL 处理——直到遇到第一个选项以-开头的参数为止。源码注释中给出了官方示例php index.php users 21 profile -foo bar // Routes to /users/21/profile (index is removed for routing sake) // with the option foo bar.这条规则的完整实现位于 parseCommand() 方法逐行拆解其解析逻辑$args $this-getServer(argv) ?? []; array_shift($args); // Scrap index.php // 丢弃脚本名本身 $optionValue false; foreach ($args as $i $arg) { if (mb_strpos($arg, -) ! 0) { // 不以 - 开头若是上一个选项正在等待值则忽略否则记为路径段 if ($optionValue) { $optionValue false; } else { $this-segments[] $arg; $this-args[] $arg; } continue; } $arg ltrim($arg, -); // 去掉前导的 - 或 -- $value null; // 如果下一个参数不以 - 开头则视为该选项的值 if (isset($args[$i 1]) mb_strpos($args[$i 1], -) ! 0) { $value $args[$i 1]; $optionValue true; } $this-options[$arg] $value; $this-args[$arg] $value; }源码中有一段值得注意的注释作者曾尝试使用 PHP 内置的getopt()但它偶尔找不到任何选项因此改用始终可靠的argv。这也解释了为什么选项的解析规则是简单顺序扫描而非完整的 getopt 风格解析。从源码结构看有两条边界规则值得牢记选项只接受紧邻的下一个非-开头参数作为值无值的选项如-f其值为null。一旦进入选项区出现第一个-开头的参数后续的非-参数不会再被追加为路径段——如果它紧跟在某个选项后面会被当作该选项的值否则会被$optionValue标志丢弃。这一规则在 CLIRequestTest 中有大量断言覆盖例如对输入user 21 --foo bar -f测试断言getOptionString()返回-foo bar -fgetPath()返回users/21/profile与上述解析规则完全吻合。附加访问器方法逐一解析以下方法与官方文档 CLIRequest Class 的 Additional Accessors 一节一一对应签名与实现均以 system/HTTP/CLIRequest.php 为准。getSegments()返回路径段数组返回被判定为路径一部分的命令行参数数组liststring// command line: php index.php users 21 profile --foo bar echo $request-getSegments(); // [users, 21, profile]实现只有一行——返回$this-segments见 getSegments()。getPath()返回重构后的路径字符串把 segments 用/拼接返回重构的路径字符串// command line: php index.php users 21 profile --foo bar echo $request-getPath(); // users/21/profile实现为implode(/, $this-segments)见 getPath()。这个路径会被用于路由定位到对应的控制器/方法index段为路由目的被移除同时也是构造函数中SiteURI的来源。getOptions()返回选项数组返回被判定为选项的命令行参数组成的关联数组键为选项名值为选项值无值时为null// command line: php index.php users 21 profile --foo bar echo $request-getOptions(); // [foo bar]getOption($key)读取单个选项的值返回指定选项的值选项不存在时返回null// command line: php index.php users 21 profile --foo bar echo $request-getOption(foo); // bar echo $request-getOption(notthere); // null实现为$this-options[$key] ?? null见 getOption()。注意它声明返回string|null因此调用方无需做空值防御。getOptionString()把选项重构为命令行字符串将当前所有选项重构为可原样传给其他命令行命令的字符串见 getOptionString()// command line: php index.php users 21 profile --foo bar echo $request-getOptionString(); // -foo bar传入true作为第一个参数时长选项选项名长度大于 1会以双横线--形式输出// php index.php user 21 --foo bar -f echo $request-getOptionString(); // -foo bar -f echo $request-getOptionString(true); // --foo bar -f从源码实现看该方法还有三条细节规则无选项时直接返回空字符串值为null的选项无值开关只输出选项名如-f值中包含空格时会自动加双引号例如选项baz queue some stuff输出为-baz queue some stuff——这与 测试用例中的断言foo bar, baz queue some stuff对应输出-foo bar -baz queue some stuff一致。其他值得了解的辅助方法文档主体之外的几个方法同样位于 CLIRequest.php对 CLI 编程很有用getArgs()返回全部参数segments 与 options 的合集见 getArgs()isCLI()恒返回trueis($type)恒返回falseCLI 请求不属于任何 Web 类型getGet()/getPost()/getCookie()等全部覆写为空操作返回[]或null因为 CLI 场景不存在这些超全局数据——这意味着你的控制器代码在 CLI 下调用这些方法不会报错getLocale()直接返回 PHP 的Locale::getDefault()而非从Accept-Language头解析。在控制器与命令中实际使用结合上面的解析规则一个典型的用法是通过路由匹配 segments通过getOption()读取选项。以官方文档的示例命令php index.php users 21 profile --foo bar为例路由到Users::profile()后public function profile() { $request service(request); // 当前即 CLIRequest $segments $request-getSegments(); // [users, 21, profile] $userId $segments[1]; // 21 $fooValue $request-getOption(foo); // bar echo User {$userId}, foo {$fooValue}; }另一个常见场景是把已有选项透传给子进程命令此时getOptionString()可以直接拼入 shell 调用$opts $request-getOptionString(true); // 例如--foo bar exec(php spark worker . escapeshellarg($opts));在测试中也可以借助框架的测试机制构造CLIRequest框架类 CodeIgniter 提供了内部方法setRequest()注释标明 Used when running certain tests从而不必真实启动 CLI 即可断言getSegments()、getOption()等行为——CLIRequestTest 正是这样验证了本文列出的全部访问器行为包括空命令时getPath()为、getSegments()为[]、getOptionString()为的边界情况。小结与使用要点请求来自命令行时service(request)返回的是CLIRequest实例它兼容常规请求的大部分 API但额外提供命令行专用访问器核心五件套getSegments()路径段数组、getPath()路径字符串、getOptions()选项数组、getOption($key)单选项值、getOptionString(bool $useLongOpts false)选项的命令行字符串传true时长选项用双横线解析规则是遇到第一个选项前的参数为路径段选项取紧邻的下一个非-参数为值无值选项值为null带空格值在getOptionString()中会被自动加引号相关源码与测试路径system/HTTP/CLIRequest.php、tests/system/HTTP/CLIRequestTest.php、文档 user_guide_src/source/cli/cli_request.rst 及其示例代码目录user_guide_src/source/cli/cli_request/001.php ~ 006.php。赞分享后端Web框架【免费下载链接】CodeIgniter4Open Source PHP Framework (originally from EllisLab)项目地址https://gitcode.com/gh_mirrors/co/CodeIgniter4点击查看免费下载相关推荐Sails 请求对象 req.subdomains解析请求 URL 子域名数组的完整指南Sails 请求对象 req.subdomains 解析请求 URL 子域名数组的完整指南 req.subdomains 是 Sails基于 Express后端FastAPI Request 类参考直接访问原始 HTTP 请求对象的机制与源码解析FastAPI Request 类参考直接访问原始 HTTP 请求对象的机制与源码解析 本篇基于 FastAPI 官方参考文档 docs/en/docs/re后端Web框架API设计Qtile Bar 命令图对象详解位置选择器、可用命令与 screen/widget 访问Qtile Bar 命令图对象详解位置选择器、可用命令与 screen/widget 访问 Bar状态栏是 Qtile 中用于在屏幕边缘显示小部件的容器。桌面应用操作系统上一篇MarkText 开发者指南从环境搭建、开发调试到生产构建下一篇最终幻想14钓鱼计时器「渔人的直感」上手指南简单四步告别幻海流手忙脚乱创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑