ตั้งค่าใน $_POST ใน Yii2 ตามคำขอที่ได้รับหรือไม่

ฉันกำลังเขียน Interceptor เพื่อตรวจสอบคำขอและถอดรหัสข้อมูลที่ได้รับจาก 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 ฉันจะค้นหาว่ามันตั้งค่าไว้ที่ส่วนหน้า ไม่ใช่ที่ใดที่หนึ่งในคอนโทรลเลอร์

คุณสามารถทำให้ interceptor ของคุณทำ:

$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

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