Accedere ai valori POST nell'oggetto richiesta di Symfony2


93

OK, questa è una domanda per principianti, ma non riesco a trovare la risposta da nessuna parte. In un controller in Symfony2, voglio accedere al valore POST da uno dei miei moduli. Nel controller ho:

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

Purtroppo $name_valuenon restituisce nulla. Che cosa sto facendo di sbagliato? Grazie!

Risposte:


99

Symfony 2.2

questa soluzione è deprecata dalla 2.3 e verrà rimossa nella 3.0, vedere la documentazione

$form->getData();

ti dà un array per i parametri del modulo

dalla pagina 162 del libro di symfony2 (Capitolo 12: Forms)

[...] a volte, potresti semplicemente voler usare un modulo senza una classe e recuperare un array dei dati inviati. In realtà è molto semplice:

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
}

Puoi anche accedere ai valori POST (in questo caso "nome") direttamente tramite l'oggetto richiesta, in questo modo:

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

Tieni presente, tuttavia, che nella maggior parte dei casi l'utilizzo del metodo getData () è una scelta migliore, poiché restituisce i dati (di solito un oggetto) dopo che sono stati trasformati dal framework del modulo.

Quando vuoi accedere al token del modulo, devi usare la risposta di Problematico $postData = $request->request->get('contact');perché getData()rimuove l'elemento dall'array


Symfony 2.3

dalla 2.3 dovresti usare handleRequestinvece di bindRequest:

 $form->handleRequest($request);

vedere la documentazione


4
È fantastico e ora è la risposta migliore. $ form-> getData () non esisteva o non era documentato quando ho posto la domanda.
Acyra

4
per legare i dati della richiesta al form nelle versioni più recenti dovresti usare $ form-> handleRequest ($ request); invece di $ form-> submit ($ request); penso. Maggiori dettagli symfony.com/doc/2.3/book/forms.html#handling-form-submissions
adridev

127

I valori del modulo post vengono memorizzati sotto il nome del modulo nella richiesta. Ad esempio, se hai sovrascritto il getName()metodo di ContactType () per restituire "contact", dovresti farlo:

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

Se hai ancora problemi, prova a fare un var_dump()su $request->request->all()per vedere tutti i valori postali.


2
Grazie. Il var_dump ha aiutato, ho finito per attaccare questo con un nome completo per recuperare i dati del modulo, ad esempio $ postData = $ request-> request-> get ('acme_somebundle_contact_type')
Acyra

1
Vedere la risposta di timaschew di seguito, poiché è stato chiesto, Symfony2 ha aggiunto un nuovo metodo: $ form-> getData ();
Acyra

2
Se hai sovrascritto il getName(), allora ha senso non codificare i nomi:$request->request->get($form->getName());
meze

Grazie .. Mi ha risparmiato molto tempo :) Saluti !!
Anjana Silva

38

quello che ha funzionato per me è stato usare questo:

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

Questo è ciò che ha menzionato Problematic, + vedi il commento di @meze lì
phpsherpa

17

C'è un trucco con il ParameterBag::get()metodo. È possibile impostare $deepil parametro per truee accedere al valore annidata profonda richiesta senza variabile in più:

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

Inoltre hai la possibilità di impostare un valore predefinito (2 ° parametro del get()metodo), può evitare isset($form['some']['deep']['data'])chiamate ridondanti .


Il terzo parametro è stato deprecato e rimosso dalla 3.0 Nota: la ricerca di elementi approfonditi è deprecata dalla versione 2.8, per essere rimossa nella 3.0. : github.com/symfony/symfony/blob/…
AL

8

È possibile accedere ai dati del campo in un controller con: Listato 12-34

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

Inoltre, i dati di un campo non mappato possono anche essere modificati direttamente: Listato 12-35

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

pagina 164 libro di symfony2 (generato il 9 ottobre 2013)


7

Accedo al parametro ticketNumber per la mia richiesta di post in più parti nel modo seguente.

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

1

Penso che per ottenere i dati della richiesta, vincolati e convalidati dall'oggetto form, sia necessario utilizzare:

$form->getClientData();


7
getClientData è deprecato. Usa getData, getViewData, getNormData .... Il componente Form è davvero disordinato in SF2 (dovrebbero davvero ispirarsi al mondo Java e al fantastico RequestDataBinder ....)
Thomas Decaux

0

Symfony doc per ottenere i dati di richiesta

Infine, è possibile accedere ai dati grezzi inviati con il corpo della richiesta utilizzando getContent ():

$ contenuto = $ richiesta-> getContent ();


-14

Se sei un principiante, benvenuto in Symfony2, un progetto open-source quindi se vuoi imparare molto, puoi aprire il codice sorgente!

Da "Form.php":

getData () getNormData () getViewData ()

Puoi trovare maggiori dettagli in questo file.


Usa sempre il modo Symfony, $ _POST, $ request è sporco
Thomas Decaux

Sì, non sono bravo per la spiegazione ^^ ma questa è esattamente la stessa soluzione di quella confermata $form->getData();So che le persone sono pigre e vogliono una soluzione senza pensarci un po ';-(
Thomas Decaux
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.