Akses nilai POST di objek permintaan Symfony2

93

Oke, ini pertanyaan pemula, tapi saya tidak bisa menemukan jawabannya di mana pun. Dalam pengontrol di Symfony2, saya ingin mengakses nilai POST dari salah satu formulir saya. Di pengontrol saya memiliki:

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');

Sayangnya $name_valuetidak mengembalikan apa pun. Apa yang saya lakukan salah? Terima kasih!

Acyra
sumber

Jawaban:

99

Symfony 2.2

solusi ini tidak digunakan lagi sejak 2.3 dan akan dihapus di 3.0, lihat dokumentasi

$form->getData();

memberi Anda array untuk parameter formulir

dari buku symfony2 halaman 162 (Bab 12: Formulir)

[...] terkadang, Anda mungkin hanya ingin menggunakan formulir tanpa kelas, dan mendapatkan kembali array data yang dikirimkan. Ini sebenarnya sangat mudah:

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
}

Anda juga dapat mengakses nilai POST (dalam hal ini "nama") secara langsung melalui objek permintaan, seperti:

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

Namun, perlu diketahui bahwa dalam banyak kasus, menggunakan metode getData () adalah pilihan yang lebih baik, karena metode ini mengembalikan data (biasanya berupa objek) setelah diubah oleh kerangka formulir.

Saat Anda ingin mengakses token formulir, Anda harus menggunakan jawaban Bermasalah $postData = $request->request->get('contact');karena getData()menghapus elemen dari array


Symfony 2.3

sejak 2.3 Anda harus menggunakan handleRequestalih-alih bindRequest:

 $form->handleRequest($request);

lihat dokumentasi

timaschew
sumber
4
Ini bagus, dan sekarang adalah jawaban terbaik. $ form-> getData () tidak ada atau tidak didokumentasikan ketika saya mengajukan pertanyaan.
Acyra
4
untuk mengikat data permintaan ke formulir dalam versi terbaru Anda harus menggunakan $ form-> handleRequest ($ request); bukannya $ form-> submit ($ request); kupikir. Lebih detail symfony.com/doc/2.3/book/forms.html#handling-form-submissions
adridev
127

Nilai posting formulir disimpan dengan nama formulir dalam permintaan. Misalnya, jika Anda telah mengganti getName()metode ContactType () untuk mengembalikan "contact", Anda akan melakukan ini:

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

Jika Anda masih mengalami masalah, cobalah melakukan var_dump()pada $request->request->all()untuk melihat semua nilai pos.

Bermasalah
sumber
2
Terima kasih. Var_dump membantu, saya akhirnya menyerang ini dengan nama lengkap untuk memulihkan data formulir misalnya $ postData = $ request-> request-> get ('acme_somebundle_contact_type')
Acyra
1
Lihat jawaban dari timaschew di bawah ini, karena ini ditanyakan, Symfony2 menambahkan metode baru: $ form-> getData ();
Acyra
2
Jika Anda telah menimpa getName(), maka masuk akal untuk tidak menggunakan nama hardcode:$request->request->get($form->getName());
meze
Terima kasih .. Menghemat banyak waktu saya :) Cheers !!
Anjana Silva
38

apa yang berhasil bagi saya adalah menggunakan ini:

$data = $request->request->all();
$name = $data['form']['name'];
ramzey
sumber
Ini yang bermasalah, + lihat komentar @meze di sana
phpsherpa
17

Ada satu trik dengan ParameterBag::get()metode. Anda dapat menyetel $deepparameter ke truedan mengakses nilai berlapis dalam yang diperlukan tanpa variabel tambahan:

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

Anda juga memiliki kemungkinan untuk menetapkan nilai default (parameter get()metode ke-2 ), ini dapat menghindari isset($form['some']['deep']['data'])panggilan yang berlebihan .

Dmitriy
sumber
Parameter ketiga sudah tidak digunakan lagi dan dihapus dari 3.0 Catatan: Menemukan item dalam tidak digunakan lagi sejak versi 2.8, akan dihapus di 3.0. : github.com/symfony/symfony/blob/…
AL
8

Data lapangan dapat diakses di pengontrol dengan: Daftar 12-34

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

Sebagai tambahan, data dari field yang belum dipetakan juga dapat diubah secara langsung: Daftar 12-35

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

halaman 164 buku symfony2 (dibuat pada 9 Oktober 2013)

meteor
sumber
7

Saya mengakses parameter ticketNumber untuk permintaan posting multibagian saya dengan cara berikut.

$data = $request->request->all();
$ticketNumber = $data["ticketNumber"];
Ilker Baltaci
sumber
1

Saya pikir untuk mendapatkan data permintaan, terikat dan divalidasi oleh objek formulir, Anda harus menggunakan:

$form->getClientData();

Chicna
sumber
7
getClientData tidak digunakan lagi. Gunakan getData, getViewData, getNormData .... Komponen Formulir benar-benar berantakan di SF2 (mereka benar-benar harus terinspirasi oleh dunia Java dan RequestDataBinder yang keren ....)
Thomas Decaux
0

Doc Symfony untuk mendapatkan data permintaan

Terakhir, data mentah yang dikirim dengan isi permintaan dapat diakses menggunakan getContent ():

$ content = $ request-> getContent ();

Alex Joe
sumber
-14

Jika Anda seorang pemula, selamat datang di Symfony2, sebuah proyek sumber terbuka jadi jika Anda ingin belajar banyak, Anda dapat membuka sumbernya!

Dari "Form.php":

getData () getNormData () getViewData ()

Anda dapat menemukan detail lebih lanjut di file ini.

Thomas Decaux
sumber
Selalu gunakan cara Symfony, $ _POST, $ permintaan kotor
Thomas Decaux
Ya saya tidak baik untuk penjelasan ^^ tapi ini adalah solusi yang persis sama dari yang dikonfirmasi $form->getData();Saya tahu orang malas dan ingin solusi tanpa berpikir sedikit pun ;-(
Thomas Decaux