我正在编写一个拦截器以验证请求并解码从POST接收到的数据。解码数据后,我必须将数据设置为$_POST
,以便我以前的所有编写器功能都可以按原样工作。
我有如下设置的值
$_POST['amount'] = $data['a'];
$_POST['currency'] = $data['c'];
我可以使用$_POST
获取这些变量,但是无法在Yii::$app->request->post()
中访问这些值
所以我的问题是可以通过Yii::$app->request->post()
答案 0 :(得分:1)
发布数据缓存在Request
组件内部,因此$_POST
中的任何更改都不会反映在Yii::$app->request->post()
中。但是,您可以使用setBodyParams()
重置此缓存:
Yii::$app->request->setBodyParams(null);
$post = Yii::$app->request->post();
或者仅使用setBodyParams()
来直接设置数据,而无需触摸$_POST
:
Yii::$app->request->setBodyParams(['amount' => $data['a'], 'currency' => $data['c']]);
答案 1 :(得分:0)
我认为您应该考虑重构代码,特别是如果您不是唯一从事此项目的人,因为人为地向$_POST
添加值只会造成混乱,应尽可能避免。如果我看到一个从$_POST
读取变量的代码,我会去寻找它是在前端而不是在控制器中的某个位置设置的。
您可以使拦截器执行以下操作:
$post = Yii::$app->request->post();
// or $post = _ $POST;
$post['foo'] = 'bar';
someNamespace::$writeData = $post;
然后,当您要访问数据时(假设它并不总是通过拦截器,并且在为空时需要进行初始化):
if (empty(someNamespace::$writeData)) {
someNamespace::$writeData = $_POST;
}
$data = someNamespace::$writeData;
并从该静态变量而不是$_POST
中读取所有内容。它更整洁,更易于维护,IMHO。
答案 2 :(得分:0)
只是对@rob006 的已接受答案进行扩展,以回应下面 Budi Mulyo 的评论。
您可以通过执行以下操作来添加帖子数据:
$params = Yii::$app->request->getBodyParams();
$params['somethingToAdd'] = 'value'
Yii::$app->request->setBodyParams($params);
仍然不确定您是否想要或需要这样做,但有可能:)