Laravel CLI(Artisan)命令行中不存在GET参数,因CLI不经过HTTP协议栈;传值必须使用Artisan原生机制:通过$signature定义{argument}和{--option},在handle()中用argument()和option()获取,支持必填/可选参数及带值/布尔选项。

CLI命令根本不存在GET参数
直接说结论:Laravel CLI(Artisan)命令行里没有 GET 参数这回事。HTTP 的 GET 是协议层概念,只存在于 Web 请求中;CLI 是本地进程调用,压根不经过 HTTP 协议栈。试图在 handle() 里调用 $request->query('foo') 或 $_GET,结果一定是 null 或未定义。
想传值?用 Artisan 命令的 argument 和 option
CLI 下真正能用的输入机制只有 Artisan 自己定义的参数和选项,必须通过 $signature 显式声明:
-
{id}表示必填位置参数,获取方式:$this->argument('id') -
{id?}表示可选位置参数,未传时返回null -
{--force}是布尔开关,$this->option('force')返回true或false -
{--env=}是带值选项,$this->option('env')返回字符串或null - 默认值写法:
{--env=local},用户不传时自动 fallback
示例签名:php:sync {model} {--batch=100} {--dry-run},对应调用:php artisan php:sync User --batch=500 --dry-run
为什么不能把 Web 请求逻辑硬搬进 CLI
常见误操作是复制控制器里 $request->input('key') 这类代码到命令类里,结果报错或取不到值。原因很实在:
-
$request实例在 CLI 中默认是Illuminate\Http\Request的空壳,query、post等属性全为空 - 即使手动绑定
Request到方法参数,框架也不会注入真实查询数据 —— 没有 URL,就没有 query string - 中间件、路由解析、参数绑定这些 Web 生命周期环节,在 CLI 中根本不触发
如果真要模拟 GET 场景,得自己解析字符串
极少数场景(比如调试迁移脚本时想复用某段 URL 查询逻辑),可以手动解析类似 ?a=1&b[]=2&b[]=3 的字符串,但注意这不是 Laravel 原生支持路径:
- 用
parse_str()解析查询字符串:parse_str('a=1&b[]=2', $output) - 数组语法
b[]=2在 CLI 下不会被自动识别,必须自己处理键名重复逻辑 - 别依赖
Request::create()构造假请求 —— 它不触发完整生命周期,route()、query()仍不可靠
真正需要跨环境共享参数逻辑的,建议把解析逻辑抽成独立服务类,CLI 和 Web 都调用它,而不是让 CLI 去模仿 HTTP 行为。


















