Tetapkan nilai dalam $_POST di Yii2 berdasarkan permintaan diterima?

Saya sedang menulis interseptor untuk memvalidasi permintaan dan mendekode data yang diterima dari POST. Setelah mendekode data, saya harus menyetel data ke $_POST agar semua fungsi penulis saya sebelumnya dapat berfungsi sebagaimana mestinya.

Saya telah menetapkan nilai seperti di bawah ini

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

Saya bisa mendapatkan variabel-variabel ini menggunakan $_POST tetapi nilai-nilai ini tidak dapat diakses di Yii::$app->request->post()

Jadi pertanyaan saya adalah bisakah saya mendapatkan nilai ini paling lambat Yii::$app->request->post()


person Aabir Hussain    schedule 18.12.2018    source sumber


Jawaban (3)


Data kiriman di-cache di dalam komponen Request, jadi perubahan apa pun di $_POST tidak akan terlihat di Yii::$app->request->post(). Namun Anda dapat menggunakan setBodyParams() untuk menyetel ulang tembolok ini:

Yii::$app->request->setBodyParams(null);

$post = Yii::$app->request->post();

Atau cukup gunakan setBodyParams() untuk menyetel data Anda secara langsung tanpa menyentuh $_POST:

Yii::$app->request->setBodyParams(['amount' => $data['a'], 'currency' => $data['c']]);
person rob006    schedule 18.12.2018
comment
Terima kasih kawan, aku hampir menjadi milik mereka - person Aabir Hussain; 18.12.2018
comment
Bisakah kami mengubah sebagian permintaan tersebut? seperti: tambahkan param lain, tetapi masih melewati param sebelumnya? - person Budi Mulyo; 27.12.2019
comment
Terlambat ke pertunjukan, tapi mungkin untuk yang lain: ya itu mungkin, dan saya menambahkan jawaban untuk melakukan hal itu. - person jberculo; 19.05.2021

Saya pikir Anda harus mempertimbangkan untuk sedikit memfaktorkan ulang kode Anda, terutama jika Anda bukan satu-satunya orang yang mengerjakan proyek tersebut karena menambahkan nilai secara artifisial ke $_POST hanya membingungkan dan harus dihindari, jika memungkinkan. Jika saya melihat kode yang membaca variabel dari $_POST, saya mencarinya diatur di frontend bukan di suatu tempat di pengontrol.

Anda dapat membuat pencegat Anda melakukan:

$post = Yii::$app->request->post();
// or $post = _ $POST;
$post['foo'] = 'bar';
someNamespace::$writeData = $post;

Kemudian ketika Anda ingin mengakses data (dengan asumsi data tidak selalu melalui interseptor dan perlu diinisialisasi saat kosong):

if (empty(someNamespace::$writeData)) {
    someNamespace::$writeData = $_POST;
}
$data = someNamespace::$writeData;

dan membaca semuanya dari variabel statis itu alih-alih $_POST. Ini kode yang lebih rapi dan lebih mudah dipelihara, IMHO.

person Marcin T.    schedule 19.12.2018

Sekadar memperluas jawaban yang diterima @rob006, sebagai tanggapan atas komentar Budi Mulyo di bawah.

Anda dapat menambahkan data postingan dengan melakukan hal berikut:

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

Masih tidak yakin apakah Anda ingin atau perlu melakukan ini, tapi mungkin saja :)

person jberculo    schedule 19.05.2021