根据收到的请求在 Yii2 的 $_POST 中设置值?
Set values in $_POST in Yii2 on request recieved?
我正在编写一个拦截器来验证从 POST 收到的请求和解码数据。解码数据后,我必须将数据设置为 $_POST
,这样我以前的所有编写器功能才能正常工作。
我设置了如下值
$_POST['amount'] = $data['a'];
$_POST['currency'] = $data['c'];
我可以使用 $_POST
获取这些变量,但在 Yii::$app->request->post()
中无法访问这些值
所以我的问题是我可以通过 Yii::$app->request->post()
获得这些值吗
Post 数据缓存在 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']]);
我认为您应该考虑稍微重构一下您的代码,特别是如果您不是唯一一个从事该项目的人,因为人为地向 $_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
读取所有内容。恕我直言,它的代码更简洁、更易于维护。
只是为了扩展 @rob006 已接受的答案,以回应 Budi Mulyo 在下面的评论。
您可以通过执行以下操作添加到 post 数据:
$params = Yii::$app->request->getBodyParams();
$params['somethingToAdd'] = 'value'
Yii::$app->request->setBodyParams($params);
仍然不确定您是否想要或需要这样做,但这是可能的:)
我正在编写一个拦截器来验证从 POST 收到的请求和解码数据。解码数据后,我必须将数据设置为 $_POST
,这样我以前的所有编写器功能才能正常工作。
我设置了如下值
$_POST['amount'] = $data['a'];
$_POST['currency'] = $data['c'];
我可以使用 $_POST
获取这些变量,但在 Yii::$app->request->post()
所以我的问题是我可以通过 Yii::$app->request->post()
Post 数据缓存在 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']]);
我认为您应该考虑稍微重构一下您的代码,特别是如果您不是唯一一个从事该项目的人,因为人为地向 $_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
读取所有内容。恕我直言,它的代码更简洁、更易于维护。
只是为了扩展 @rob006 已接受的答案,以回应 Budi Mulyo 在下面的评论。
您可以通过执行以下操作添加到 post 数据:
$params = Yii::$app->request->getBodyParams();
$params['somethingToAdd'] = 'value'
Yii::$app->request->setBodyParams($params);
仍然不确定您是否想要或需要这样做,但这是可能的:)