Установить значения в $_POST в Yii2 по запросу?

Я пишу перехватчик для проверки запроса и декодирования данных, полученных от POST. После декодирования данных я должен установить для данных значение $_POST, чтобы все мои предыдущие функции записи работали как есть.

Я установил значения, как показано ниже

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

Я могу получить эти переменные с помощью $_POST, но эти значения недоступны в Yii::$app->request->post()

Итак, мой вопрос: могу ли я получить эти значения до Yii::$app->request->post()?


person Aabir Hussain    schedule 18.12.2018    source источник


Ответы (3)


Данные сообщения кэшируются внутри компонента 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']]);
person rob006    schedule 18.12.2018
comment
Спасибо бро, я был почти их - person Aabir Hussain; 18.12.2018
comment
Можем ли мы частично изменить запрос? например: добавить другой параметр, но все же передать предыдущий параметр? - person Budi Mulyo; 27.12.2019
comment
Поздно на шоу, но, может быть, для других: да, это возможно, и я добавил ответ, делая именно это. - person jberculo; 19.05.2021

Я думаю, вам следует подумать о небольшом рефакторинге вашего кода, особенно если вы не единственный человек, работающий над проектом, потому что искусственное добавление значений в $_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. Это более аккуратный и гораздо более удобный код, ИМХО.

person Marcin T.    schedule 19.12.2018

Просто чтобы расширить принятый ответ @ rob006 в ответ на комментарий ниже этого от Budi Mulyo.

Вы можете добавить к сообщению данные, выполнив следующие действия:

    $params = Yii::$app->request->getBodyParams();
    $params['somethingToAdd'] = 'value'
    Yii::$app->request->setBodyParams($params);

Все еще не уверен, если вы хотите или нужно это сделать, но это возможно :)

person jberculo    schedule 19.05.2021