เข้าถึงค่า POST ในอ็อบเจ็กต์คำขอ Symfony2


93

ตกลงนี่เป็นคำถามสำหรับมือใหม่ แต่ฉันหาคำตอบไม่ได้เลย ในคอนโทรลเลอร์ใน Symfony2 ฉันต้องการเข้าถึงค่า POST จากฟอร์มของฉัน ในคอนโทรลเลอร์ฉันมี:

public function indexAction()
{ 
    $request = $this->get('request');
    if ($request->getMethod() == 'POST') {
        $form = $this->get('form.factory')->create(new ContactType());
        $form->bindRequest($request);
        if ($form->isValid()) {
            $name_value = $request->request->get('name');

น่าเสียดายที่$name_valueไม่ได้ส่งคืนอะไรเลย ผมทำอะไรผิดหรือเปล่า? ขอบคุณ!

คำตอบ:


99

Symfony 2.2

โซลูชันนี้เลิกใช้งานตั้งแต่ 2.3 และจะถูกลบออกใน 3.0 โปรดดูเอกสารประกอบ

$form->getData();

ให้อาร์เรย์สำหรับพารามิเตอร์ฟอร์ม

จากหนังสือ symfony2หน้า 162 (บทที่ 12: แบบฟอร์ม)

[... ] บางครั้งคุณอาจต้องการใช้แบบฟอร์มที่ไม่มีคลาสและรับอาร์เรย์ของข้อมูลที่ส่งกลับมา นี่เป็นเรื่องง่ายจริงๆ:

public function contactAction(Request $request) {
  $defaultData = array('message' => 'Type your message here');
  $form = $this->createFormBuilder($defaultData)
  ->add('name', 'text')
  ->add('email', 'email')
  ->add('message', 'textarea')
  ->getForm();
  if ($request->getMethod() == 'POST') {
    $form->bindRequest($request);
    // data is an array with "name", "email", and "message" keys
    $data = $form->getData();
  }
  // ... render the form
}

คุณยังสามารถเข้าถึงค่า POST (ในกรณีนี้คือ "name") โดยตรงผ่านออบเจ็กต์คำขอเช่น:

$this->get('request')->request->get('name');

อย่างไรก็ตามโปรดทราบว่าในกรณีส่วนใหญ่การใช้เมธอด getData () เป็นทางเลือกที่ดีกว่าเนื่องจากจะส่งคืนข้อมูล (โดยปกติจะเป็นอ็อบเจ็กต์) หลังจากที่ถูกแปลงโดยกรอบฟอร์ม

เมื่อคุณต้องการเข้าถึงโทเค็นแบบฟอร์มคุณต้องใช้คำตอบของ Problematic $postData = $request->request->get('contact');เนื่องจากgetData()ลบองค์ประกอบออกจากอาร์เรย์


Symfony 2.3

ตั้งแต่ 2.3 คุณควรใช้handleRequestแทนbindRequest:

 $form->handleRequest($request);

ดูเอกสารประกอบ


4
นี่เป็นคำตอบที่ดีที่สุดและตอนนี้เป็นคำตอบที่ดีที่สุด $ form-> getData () ไม่มีอยู่จริงหรือไม่ได้รับการบันทึกไว้เมื่อฉันถามคำถาม
Acyra

4
ในการผูกข้อมูลคำขอเข้ากับรูปแบบในเวอร์ชันล่าสุดคุณควรใช้ $ form-> handleRequest ($ request); แทน $ form-> submit (คำขอ $); ฉันคิด. รายละเอียดเพิ่มเติมsymfony.com/doc/2.3/book/forms.html#handling-form-submissions
adridev

127

ค่าโพสต์แบบฟอร์มจะถูกเก็บไว้ภายใต้ชื่อของแบบฟอร์มในคำขอ ตัวอย่างเช่นหากคุณได้ลบล้างgetName()เมธอด ContactType () เพื่อส่งคืน "contact" คุณจะต้องดำเนินการดังนี้:

$postData = $request->request->get('contact');
$name_value = $postData['name'];

หากคุณยังคงประสบปัญหาลองดำเนินการvar_dump()ต่อ$request->request->all()เพื่อดูค่าโพสต์ทั้งหมด


2
ขอขอบคุณ. var_dump ช่วยฉันลงเอยด้วยการโจมตีสิ่งนี้ด้วยชื่อเต็มเพื่อกู้คืนข้อมูลในรูปแบบเช่น $ postData = $ request-> request-> get ('acme_somebundle_contact_type')
Acyra

1
ดูคำตอบจาก timaschew ด้านล่างเนื่องจากสิ่งนี้ถูกถาม Symfony2 จึงเพิ่มวิธีการใหม่: $ form-> getData ();
Acyra

2
หากคุณได้ลบล้างไปgetName()แล้วมันก็สมเหตุสมผลแล้วที่จะไม่ใช้ชื่อฮาร์ดโค้ด:$request->request->get($form->getName());
meze

ขอบคุณ .. ประหยัดเวลาของฉันได้มาก :) ไชโย !!
Anjana Silva

38

สิ่งที่ได้ผลสำหรับฉันคือใช้สิ่งนี้:

$data = $request->request->all();
$name = $data['form']['name'];

นี่คือสิ่งที่กล่าวถึงปัญหา + ดูความคิดเห็นของ @meze ที่นั่น
phpsherpa

17

มีเคล็ดลับอย่างหนึ่งด้วยParameterBag::get()วิธีการ คุณสามารถตั้งค่า$deepพารามิเตอร์การtrueและการเข้าถึงที่จำเป็นต้องใช้ค่าที่ซ้อนกันลึกโดยไม่ต้องตัวแปรพิเศษ:

$request->request->get('form[some][deep][data]', null, true);

นอกจากนี้คุณยังมีความเป็นไปได้ที่จะตั้งค่าเริ่มต้น (พารามิเตอร์ที่ 2 ของget()วิธีการ) ซึ่งสามารถหลีกเลี่ยงการisset($form['some']['deep']['data'])โทรซ้ำซ้อน


พารามิเตอร์ที่สามเลิกใช้งานแล้วและลบออกจาก 3.0 หมายเหตุ: การค้นหาไอเท็มแบบลึกจะเลิกใช้งานตั้งแต่เวอร์ชัน 2.8 ซึ่งจะถูกลบออกใน 3.0 : github.com/symfony/symfony/blob/…
AL

8

ข้อมูลภาคสนามสามารถเข้าถึงได้ในคอนโทรลเลอร์โดยมี: รายการ 12-34

$form->get('dueDate')->getData();

นอกจากนี้ยังสามารถแก้ไขข้อมูลของเขตข้อมูลที่ไม่ได้แมปได้โดยตรง: รายการ 12-35

$form->get('dueDate')->setData(new \DateTime());

หน้า 164 หนังสือ symfony2 (สร้างเมื่อ 9 ตุลาคม 2556)


7

ฉันเข้าถึงพารามิเตอร์ ticketNumber สำหรับคำขอโพสต์หลายส่วนของฉันด้วยวิธีต่อไปนี้

$data = $request->request->all();
$ticketNumber = $data["ticketNumber"];

1

ฉันคิดว่าในการรับข้อมูลคำขอผูกมัดและตรวจสอบโดยออบเจ็กต์ฟอร์มคุณต้องใช้:

$form->getClientData();


7
getClientData เลิกใช้งานแล้ว ใช้ getData, getViewData, getNormData .... คอมโพเนนต์ฟอร์มยุ่งมากใน SF2 (ควรได้รับแรงบันดาลใจจากโลก Java และ RequestDataBinder ที่ยอดเยี่ยม ... )
Thomas Decaux

0

Symfony docเพื่อรับข้อมูลคำขอ

สุดท้ายข้อมูลดิบที่ส่งพร้อมกับเนื้อหาคำขอสามารถเข้าถึงได้โดยใช้ getContent ():

$ content = $ request-> getContent ();


-14

หากคุณเป็นมือใหม่ยินดีต้อนรับสู่ Symfony2 ซึ่งเป็นโครงการโอเพ่นซอร์สดังนั้นหากคุณต้องการเรียนรู้มากคุณสามารถเปิดซอร์สได้!

จาก "Form.php":

getData () getNormData () getViewData ()

คุณสามารถดูรายละเอียดเพิ่มเติมได้ในไฟล์นี้


ใช้วิธี Symfony เสมอ $ _POST คำขอ $ สกปรก
Thomas Decaux

ใช่ฉันอธิบายไม่เก่ง ^^ แต่นี่เป็นวิธีแก้ปัญหาเดียวกันกับที่ยืนยันว่า$form->getData();ฉันรู้ว่าคนขี้เกียจและต้องการวิธีแก้ปัญหาโดยไม่ต้องคิดเลยสักนิด ;-(
Thomas Decaux
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.