根据收到的请求在 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);

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