Cara mendapatkan parameter permintaan di symfony2


203

Saya sangat baru dalam symfony. Dalam bahasa lain seperti java dan lainnya saya dapat menggunakanrequest.getParameter('parmeter name') untuk mendapatkan nilai.

Apakah ada hal serupa yang dapat kita lakukan dengan symfony2.
Saya telah melihat beberapa contoh tetapi tidak ada yang bekerja untuk saya. Misalkan saya memiliki bidang isian dengan nama pengguna . Dalam bentuk tindakan saya mencoba menggunakan sesuatu seperti ini:

$request = $this->getRequest();
$username= $request->request->get('username'); 

Saya juga sudah mencoba

$username = $request->getParameter('username');

dan

$username=$request->request->getParameter('username');

Tapi tidak ada opsi yang berfungsi. Namun berikut ini berfungsi dengan baik:

foreach($request->request->all() as $req){
    print_r($req['username']);
}

Di mana saya melakukan kesalahan dalam menggunakan getParameter()metode. Bantuan apa pun akan dihargai.


Anda memiliki salah ketik di baris dua: $request->request-get()seharusnya $request->request->get(). Mungkinkah itu?
Halfer

telah menulis yang sama di code.missed di sini. maaf untuk kesalahan ketik di sini. masih ini tidak berfungsi.
Abdul Hamid

Sudahkah Anda (a) memeriksa manual untuk memastikan bahwa itu get()adalah metode yang benar dan (b) menyalakan pemberitahuan PHP sehingga Anda dapat melihat apakah ada masalah? (c) Apakah Symfony 2 memiliki toolbar debug seperti symfony 1, sehingga Anda dapat melihat apakah Anda telah membuat kesalahan?
halfer

Apakah Anda bingung dengan nama depan dan nama pengguna?
greg0ire

Jawaban:


416

Penamaannya tidak terlalu intuitif:

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request)
{
    // $_GET parameters
    $request->query->get('name');

    // $_POST parameters
    $request->request->get('name');

46
Ini berbeda dari apa yang digunakan PHP, tetapi sebenarnya lebih masuk akal. $_GETdata adalah data dari string kueri (tidak ada GETpermintaan yang diperlukan sama sekali) dan $_POSTdata adalah data dari badan permintaan (tidak harus berupa POSTpermintaan juga, bisa saja PUT).
igorw

5
mencoba $ request-> query-> get ('name'); tetapi juga tidak berfungsi.
Abdul Hamid

7
Bagaimana cara saya mendapatkan parameter dari permintaan PUT?
Tjorriemorrie

10
Penamaan yang sangat aneh di sini, pasti $request->getdan $request->postakan lebih sederhana.
crmpicco

3
komentar dari igorw memberi kejelasan pada konvensi penamaan yang aneh ini
Dheeraj

32

Saya melakukannya lebih sederhana:

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request)
{
    $foo = $request->get('foo');
    $bar = $request->get('bar');
}

Pilihan lain adalah untuk memperkenalkan parameter Anda ke dalam definisi fungsi aksi Anda:

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request, $foo, $bar)
{
    echo $foo;
    echo $bar;
}

yang, kemudian menganggap bahwa Anda mendefinisikan {foo} dan {bar} sebagai bagian dari pola URL Anda di file routing.yml Anda:

acme_myurl:
    pattern:  /acme/news/{foo}/{bar}
    defaults: { _controller: AcmeBundle:Default:getnews }

dan dalam contoh pertama, jika saya memiliki fooparameter dalam string kueri dan dalam tubuh POST, yang mana yang akan dikembalikan $request->get('foo')?
Dimitry K

1
Sepertinya yang diutamakan adalah GET, PATH, POST api.symfony.com/master/Symfony/Component/HttpFoundation/…
Dimitry K

Ini adalah jawaban terbaik
steampowered

7
Bukan itu. Dokumentasi metode itu sendiri mengatakan tidak disarankan untuk menggunakannya karena lebih berat daripada mengakses parameter GET / POST melalui koleksi spesifik mereka.
Jurchiks

1
Jawabannya benar $request->get('foo'); untuk SEMUA tas (urutannya adalah: PATH, GET, POST). Namun demikian, $request->request->get('foo');hanya berfungsi untuk tas POST. Akhirnya, yang pertama ( $request->get()) tidak direkomendasikan jika kita tahu di mana datanya (GET / POST).
F2000

18

Anda bisa menggunakan kode berikut untuk mendapatkan nilai kolom formulir Anda

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request)
{
    // retrieve GET and POST variables respectively
    $request->query->get('foo');
    $request->request->get('bar', 'default value if bar does not exist');
}

Atau Anda juga bisa mendapatkan semua nilai formulir sebagai array dengan menggunakan

$request->request->all()

3
$ request-> request-> all () berfungsi untuk saya tetapi sesuatu seperti $ request-> query-> get ('foo'); tidak bekerja.
Abdul Hamid

13

mencoba

$request->request->get('acme_demobundle_usertype')['username']

periksa nama atribut dari bidang formular Anda


1
+1, karena saya pikir dari semua respons, hanya yang ini yang benar-benar menyatakan hal yang tidak jelas - dalam kasus Anda telah membuat formulir Anda secara otomatis dengan bantuan pembuat formulir symfony, symfony mengubah nama bidang formulir menjadi sesuatu yang lebih dari yang Anda inginkan mengharapkan. Seperti nama = "acme_demobundle_userform [field_name]"
userfuser

Sintaks yang Anda sebutkan di sini tidak bekerja dengan php 5.3.10. Apa versi minimum untuk mendukung itu?
Justinas Lelys

2
@justinasLelys coba $ userType = $ request-> request-> get ('acme_demobundle_usertype'); $ username = $ userType ['username'];
sleep-er

@JustinasLelys Sintaks adalah PHP 5.4
COil

"nama pengguna" tidak dapat ditentukan. Jadi lebih baik periksa dengan "??" pertama.
Viktor Sydorenko

9

Di dalam controller:

$request = $this->getRequest();
$username = $request->get('username');

6
Dalam versi yang lebih baru dari Symfony, $this->getRequest()tidak digunakan lagi, demi menyuntikkan Permintaan ke dalam tindakan pengontrol, misalnya:public function showAction(Request $request, $id);
Adam Elsodaney

9

Pilihan Anda:

  1. Sederhana:
    • $request->request->get('param')( $_POST['param']) atau
    • $request->query->get('param')( $_GET['param'])
  2. Formulir Symfony yang baik dengan semua validasi, transormasi nilai, dan perenderan formulir dengan kesalahan dan banyak fitur lainnya:
  3. Sesuatu di antaranya (lihat contoh di bawah)
<?php
/**
 * @Route("/customers", name="customers")
 *
 * @param Request $request
 * @return Response
 */
public function index(Request $request)
{
    $optionsResolver = new OptionsResolver();
    $optionsResolver->setDefaults([
        'email' => '',
        'phone' => '',
    ]);
    $filter = $optionsResolver->resolve($request->query->all());

    /** @var CustomerRepository $customerRepository */
    $customerRepository = $this->getDoctrine()->getRepository('AppBundle:Customer');

    /** @var Customer[] $customers */
    $customers = $customerRepository->findFilteredCustomers($filter);

    return $this->render(':customers:index.html.twig', [
        'customers' => $customers,
        'filter' => $filter,
    ]);
}

Lebih lanjut tentang OptionsResolver- http://symfony.com/doc/current/components/options_resolver.html


8

Karena $this->getRequest()metode sekarang sudah tidak digunakan lagi, Anda perlu menyuntikkan Requestobjek ke dalam tindakan pengontrol Anda seperti ini:

public function someAction(Request $request)

setelah itu Anda dapat menggunakan salah satu dari yang berikut ini.

Jika Anda ingin mengambil data POST dari permintaan, gunakan yang berikut:

$request->request->get('var_name');

tetapi jika Anda ingin mengambil data GET dari permintaan gunakan ini:

$request->query->get('var_name');

6

Anda dapat melakukannya:

$clientName = $request->request->get('appbundle_client')['clientName'];

Terkadang, ketika atribut dilindungi, Anda tidak dapat memiliki akses untuk mendapatkan nilai untuk metode akses umum:

(POS)

 $clientName = $request->request->get('clientName');

(DAPATKAN)

$clientName = $request->query->get('clientName');

(UMUM)

$clientName = $request->get('clientName');

1
Selamat datang di Stack Overflow. Harap format jawaban Anda agar lebih mudah dibaca di lain waktu dan periksa juga halaman bantuan ini: Cara Menjawab
Fabian Horlacher

bagaimana jika ada 2 nilai setelah dapatkan? seperti ini$clientName = $request->query->get('clientName','any');
Munkhdelger Tumenbayar

3

Sebagian besar kasus seperti mendapatkan string kueri atau parameter formulir tercakup dalam jawaban di atas.

Saat bekerja dengan data mentah, seperti string JSON mentah di tubuh yang ingin Anda berikan sebagai argumen json_decode(), metode Request::getContent()ini dapat digunakan.

$content = $request->getContent();

Informasi tambahan yang berguna tentang permintaan HTTP di Symfony dapat ditemukan pada dokumentasi paket HttpFoundation .


1
$request = Request::createFromGlobals();
$getParameter = $request->get('getParameter');

Apakah ini masih cara untuk pergi untuk fungsi yang tidak memiliki Requestparameter? (misalnya dalam fungsi pribadi dari kelas controller misalnya)
fritzmg

1
use Symfony\Component\HttpFoundation\Request;

public function indexAction(Request $request, $id) {

    $post = $request->request->all();

    $request->request->get('username');

}

Terima kasih, Anda juga dapat menggunakan kode di atas


0

Jika Anda perlu mendapatkan nilai dari pilih, Anda dapat menggunakan:

$form->get('nameSelect')->getClientData();

0

Coba ini, ini berhasil

$this->request = $this->container->get('request_stack')->getCurrentRequest();

Salam


Ini sama sekali tidak menjawab pertanyaan. Orang yang mengajukan pertanyaan sudah memiliki akses ke objek permintaan.
Layton Everson

1
@LaytonEverson maaf tetapi Anda salah, metodenya // $ this-> getRequest () sudah tidak digunakan lagi sejak 2.4, itu sebabnya tidak berfungsi, jadi dia tidak benar-benar memiliki akses ke objek permintaan;)
AchrafSoltani

Meskipun Anda tidak salah tentang itu, penanya bertanya-tanya metode apa yang mengambil variabel dari objek permintaan. @Cerad menjawab pertanyaan ini dengan benar. Tidak hanya menyediakan cara yang benar untuk mengakses objek Permintaan, ia juga menjawab pertanyaan pertanyaan.
Layton Everson

0
public function indexAction(Request $request)
{
   $data = $request->get('corresponding_arg');
   // this also works
   $data1 = $request->query->get('corresponding_arg1');
}

1
Meskipun kode ini dapat menjawab pertanyaan, akan lebih baik untuk memasukkan beberapa konteks, menjelaskan cara kerjanya dan kapan menggunakannya. Jawaban kode saja tidak berguna dalam jangka panjang.
Bono

0

Untuk pengguna symfony 4:

$query = $request->query->get('query');

0

# www.example / register / admin

  /**
 * @Route("/register/{role}", name="app_register", methods={"GET"})
 */
public function register(Request $request, $role): Response
{
 echo $role ;
 }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.