是否在收到请求后在Yii2中的$ _POST中设置值?

时间:2018-12-18 09:44:28

标签: php yii2 yii2-advanced-app

我正在编写一个拦截器以验证请求并解码从POST接收到的数据。解码数据后,我必须将数据设置为$_POST,以便我以前的所有编写器功能都可以按原样工作。

我有如下设置的值

$_POST['amount'] = $data['a'];
$_POST['currency'] = $data['c'];

我可以使用$_POST获取这些变量,但是无法在Yii::$app->request->post()中访问这些值

所以我的问题是可以通过Yii::$app->request->post()

获得这些值

3 个答案:

答案 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);

仍然不确定您是否想要或需要这样做,但有可能:)