yii框架restful接口中,$_get和$_post不可直接使用,必须通过yii::$app->request->get()或getbodyparam()获取参数,否则会漏过滤、csrf校验及json解析;get()兼容query参数与_method伪造,getbodyparam()专解json等非表单请求体。

Yii 框架的 RESTful 接口里,$_GET 和 $_POST 不能直接用 —— 不是失效了,而是被框架封装后绕过原始超全局变量,必须走 Yii::$app->request 的统一入口,否则可能漏掉参数、无法兼容 PUT/PATCH 请求、或在开启 CSRF 验证时被拦截。
RESTful 接口中 get 参数该用 get() 还是 queryParams?
两者等价,但推荐用 get():它内部调用 getQueryParams(),并做了空值兜底;而直接读 queryParams 是未初始化时返回 null,容易触发 Notice。
-
Yii::$app->request->get('page', 1)安全取值,没传就用默认值1 -
Yii::$app->request->queryParams['page']会报Undefined index(如果 URL 没带?page=...) - RESTful 场景下,
get()还能自动识别通过X-HTTP-Method-Override或_method伪造的 GET 请求(比如前端用 POST 模拟 GET 查询)
POST/PUT/PATCH 请求体里的参数为什么 post() 拿不到?
因为 RESTful 接口通常发的是 JSON,不是 application/x-www-form-urlencoded。此时 post() 和 bodyParams 都为空 —— 它们只解析表单编码,不解析 JSON。
- 真正该用的是
Yii::$app->request->getBodyParam('id')或Yii::$app->request->rawBody -
getBodyParam()会自动解析application/json、application/x-www-form-urlencoded、multipart/form-data三种格式的请求体 - 若需手动解析 JSON:
$json = json_decode(Yii::$app->request->rawBody, true); $id = $json['id'] ?? null;
- 注意:如果控制器行为里没配置
'enableCsrfValidation' => false,而请求又没带 CSRF token,bodyParams会被清空(这是 Yii2 的默认防护逻辑)
getParam() 在 RESTful 中还能用吗?
能,但不推荐。它是 Yii1 风格的遗留方法,Yii2 中已标记为 @deprecated,且行为不一致:
-
Yii::$app->request->getParam('id')实际上会先查get(),再查post(),最后查bodyParams()—— 顺序固定,不可控 - 在 RESTful 里,这种“混合查找”容易掩盖问题:比如你本意是取 JSON body 里的
id,结果被 query string 里的同名参数覆盖了 - 明确语义优于隐式 fallback,直接用
get()或getBodyParam()更可靠
最易忽略的一点:Yii2 的 Request 组件默认不解析 application/json 的 PUT/PATCH 请求体,除非你显式启用 yii\web\JsonParser(通常在 config/web.php 的 request 组件配置中加 'parsers' => ['application/json' => 'yii\web\JsonParser'])。没配的话,getBodyParam() 对 JSON PUT 请求永远返回 null。











