最稳方式是用$request->get()和$request->post(),而非$_GET或$_POST;前者经框架统一处理,支持默认值、类型转换、过滤及嵌套结构还原,后者绕过框架易出错且协程不安全。
Webman 里获取 GET/POST 参数,最稳的方式是用和,而不是直接读或—— 后者绕过框架的统一处理,会丢掉默认值、类型转换、过滤逻辑,还可能在协程环境下出问题。
控制器方法里怎么安全取 GET 参数
Webman 控制器方法参数中注入
对象后,直接调用
即可。它比原生
更可靠,因为自动处理了空值、默认值、嵌套数组结构:
:没传
就返回
,不是
报错
:显式设默认值,避免后续判空逻辑爆炸
可能是字符串,也可能是数组(如
),
会原样还原结构,而
在某些 PHP 配置下会变成字符串
如果用了自定义
类(比如加了
过滤),
会自动走过滤逻辑;
完全绕过
POST 数据不能只靠
,尤其要防 JSON 提交
很多人以为
能拿到所有 POST 数据,但 Webman 实际支持三类 POST 内容:表单编码(
)、JSON(
)、原始数据(
)。
只对第一种有效,其他两种为空:
:自动识别并解析表单或 JSON,统一取值
:强制按 JSON 解析整个 body,返回关联数组或对象,适合前后端分离场景
:拿到原始字符串,适合处理非标准格式(如 XML、自定义二进制协议)
若前端用
发 JSON,但你只写
,结果永远是空 —— 这是最常踩的坑
助手函数
的适用边界在哪
是全局可用的快捷方式,本质是
的封装,但它和
/
行为不同:
立即学习
“
PHP免费学习笔记(深入)
”;
会依次查找:路由参数 → GET → POST → 默认值,顺序固定,不可配置
的默认值只在全部来源都未命中时生效
不推荐在需要明确来源的场景用
,比如「这个
必须来自 header 或 query,不能是 POST」—— 此时必须用
或
参数名含点号(如
)时,
支持点语法访问嵌套,
不支持,这点要注意
CLI 模式下根本拿不到 GET/POST —— 别混用场景
Webman 的
对象只在 HTTP 请求生命周期内存在。如果你在
或命令行脚本里直接调用
或
,会报
:
CLI 参数必须用
手动解析,索引从 1 开始,
是脚本路径
只适合简单开关(如
、
),复杂子命令(如
)得自己切
数组
别试图在 CLI 里伪造一个
对象来“兼容”HTTP 逻辑 —— 路由、中间件、session 全都不起作用,纯属给自己埋雷
真正容易被忽略的是:参数来源优先级(路由 > GET > POST)和 CLI/HTTP 环境隔离这两条线,一旦跨过去,调试成本会指数上升。
$request->get()$request->post()$_GET$_POSTsupport\Requestget()$_GET$request->get('id')idnullNotice$request->get('name', 'guest')$request->get('filter')?filter[status]=1&filter[type]=2get()$_GET['filter']Requesthtmlspecialcharsget()$_GET$_POST$_POSTapplication/x-www-form-urlencodedapplication/jsontext/plain$_POST$request->post('email')$request->json()$request->rawBody()fetch$_POST['email']input()input()request()->input()get()post()input('name')input('name', 'default')input()token$request->header('token')$request->get('token')user.emailinput()get()$requeststart.phpget()input()Call to a member function get() on null$_SERVER['argv']$_SERVER['argv'][0]getopt()-d--env=prodphp start.php user create --name=tom$_SERVER['argv']Request