Come ottenere i parametri di richiesta in symfony2


203

Sono molto nuovo con symfony. In altre lingue come Java e altre che posso usare request.getParameter('parmeter name')per ottenere il valore.

C'è qualcosa di simile che possiamo fare con symfony2.
Ho visto alcuni esempi ma nessuno funziona per me. Supponiamo che io abbia un campo modulo con il nome utente . Nella forma dell'azione ho cercato di usare qualcosa del genere:

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

Ho anche provato

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

e

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

Ma nessuna delle opzioni funziona. Tuttavia, ciò che segue ha funzionato bene:

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

Dove sto sbagliando nell'uso del getParameter()metodo. Qualsiasi aiuto sarà apprezzato.


Hai un refuso nella seconda riga: $request->request-get()dovrebbe essere $request->request->get(). Potrebbe essere?
halfer

ho scritto lo stesso nel code.missed qui. Scusa per l'errore di battitura qui. Ancora non funziona.
Abdul Hamid,

Hai (a) controllato il manuale per accertarti che get()sia il metodo corretto e (b) abbia attivato le notifiche PHP in modo da poter vedere se ci sono problemi? (c) Symfony 2 ha una barra degli strumenti di debug come symfony 1, quindi puoi vedere se hai commesso degli errori?
halfer

Stai confondendo nome e nome utente?
greg0ire,

Risposte:


416

La denominazione non è poi così intuitiva:

use Symfony\Component\HttpFoundation\Request;

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

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

46
È diverso da quello che utilizza PHP, ma in realtà ha più senso. $_GETi dati sono dati dalla stringa di query (nessuna GETrichiesta affatto necessaria) e i $_POSTdati sono dati dal corpo della richiesta (non deve essere POSTneanche una richiesta, potrebbe essere PUT).
igorw

5
provato $ request-> query-> get ('nome'); ma non funziona neanche.
Abdul Hamid,

7
Come ottengo i parametri da una richiesta PUT?
Tjorriemorrie,

10
Nominare molto strano qui, sicuramente $request->gete $request->postsarebbe più semplice.
crmpicco,

3
il commento di igorw chiarisce questa strana convenzione di denominazione
Dheeraj

32

Lo faccio ancora più semplice:

use Symfony\Component\HttpFoundation\Request;

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

Un'altra opzione è quella di introdurre i parametri nella definizione della funzione di azione:

use Symfony\Component\HttpFoundation\Request;

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

che, quindi, presuppone che tu abbia definito {foo} e {bar} come parte del tuo pattern URL nel tuo file routing.yml:

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

e nel primo esempio, se ho un fooparametro sia nella stringa di query che nel corpo POST, da quale verrà restituito $request->get('foo')?
Dimitry K

1
Sembra che la precedenza sia GET, PATH, POST api.symfony.com/master/Symfony/Component/HttpFoundation/…
Dimitry K

Questa è la risposta migliore
potenziato a vapore il

7
No non lo è. La documentazione del metodo stesso dice che è sconsigliato usarlo perché è più pesante dell'accesso ai parametri GET / POST attraverso le loro raccolte specifiche.
Jurchiks,

1
La risposta è corretta $request->get('foo'); funziona per TUTTE le borse (l'ordine è: PATH, GET, POST). Tuttavia, $request->request->get('foo');funziona solo per la borsa POST. Infine, il primo ( $request->get()) non è raccomandato se sappiamo dove sono i dati (GET / POST).
F2000,

18

È possibile utilizzare il codice seguente per ottenere i valori dei campi del modulo

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

Oppure è anche possibile ottenere tutti i valori del modulo come array utilizzando

$request->request->all()

3
$ request-> request-> all () funziona per me ma qualcosa come $ request-> query-> get ('pippo'); non funziona.
Abdul Hamid,

13

provare

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

ispeziona il nome dell'attributo del tuo campo formulare


1
+1, dal momento che penso che di tutte le risposte, solo questa affermi effettivamente la cosa non ovvia - nel caso in cui tu abbia creato i tuoi moduli automaticamente con l'aiuto del form builder di symfony, symfony rinomina il campo del modulo in qualcosa di più di quanto avresti aspettarsi. Like name = "acme_demobundle_userform [field_name]"
userfuser

La sintassi che hai menzionato qui non funziona con php 5.3.10. Qual è la versione minima per supportarlo?
Justinas Lelys,

2
@justinasLelys try $ userType = $ request-> request-> get ('acme_demobundle_usertype'); $ username = $ userType ['username'];
sonno

La sintassi di @JustinasLelys è PHP 5.4
COil

"nome utente" non può essere definito. Quindi meglio controllare con "??" primo.
Viktor Sydorenko l'

9

All'interno di un controller:

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

6
Nelle versioni più recenti di Symfony, $this->getRequest()è deprecato, a favore dell'iniezione della richiesta nell'azione del controller, ad esempio:public function showAction(Request $request, $id);
Adam Elsodaney,

9

Le tue opzioni:

  1. Semplice:
    • $request->request->get('param')( $_POST['param']) o
    • $request->query->get('param')( $_GET['param'])
  2. Buoni moduli di Symfony con tutta la convalida, la transormazione del valore e il rendering dei moduli con errori e molte altre funzionalità:
  3. Qualcosa nel mezzo (vedi esempio sotto)
<?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,
    ]);
}

Ulteriori informazioni su OptionsResolver: http://symfony.com/doc/current/components/options_resolver.html


8

Poiché ora il $this->getRequest()metodo è obsoleto, è necessario iniettare l' Requestoggetto nell'azione del controller in questo modo:

public function someAction(Request $request)

successivamente è possibile utilizzare una delle seguenti opzioni.

Se si desidera recuperare i dati POST dalla richiesta, utilizzare quanto segue:

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

ma se vuoi recuperare i dati GET dalla richiesta usa questo:

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

6

Puoi farlo in questo modo:

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

A volte, quando gli attributi sono protetti, non è possibile avere accesso per ottenere il valore per il metodo di accesso comune:

(INVIARE)

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

(OTTENERE)

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

(GENERICO)

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

1
Benvenuto in Stack Overflow. Formatta la tua risposta per renderla più leggibile la prossima volta e controlla anche questa pagina di aiuto: Come rispondere
Fabian Horlacher,

cosa succede se dopo 2 viene visualizzato un valore? così$clientName = $request->query->get('clientName','any');
Munkhdelger Tumenbayar,

3

La maggior parte dei casi come ottenere la stringa di query o i parametri del modulo sono trattati nelle risposte sopra.

Quando si lavora con dati non elaborati, come una stringa JSON non elaborata nel corpo che si desidera fornire come argomento json_decode(), è Request::getContent()possibile utilizzare il metodo .

$content = $request->getContent();

Ulteriori informazioni utili sulle richieste HTTP in Symfony sono disponibili nella documentazione del pacchetto HttpFoundation .


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

È ancora la strada da percorrere per funzioni che non hanno il Requestparametro? (ad esempio nelle funzioni private della classe controller per esempio)
fritzmg

1
use Symfony\Component\HttpFoundation\Request;

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

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

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

}

Grazie, puoi anche usare il codice sopra


0

Se è necessario ottenere il valore da una selezione, è possibile utilizzare:

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

0

Prova questo, funziona

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

Saluti


Questo non risponde affatto alla domanda. La persona che ha posto la domanda ha già accesso all'oggetto richiesta.
Layton Everson,

1
@LaytonEverson scusa ma ti sbagli, il suo metodo // $ this-> getRequest () è deprecato dal 2.4, ecco perché non funziona, quindi non ha davvero accesso all'oggetto richiesta;)
AchrafSoltani

Sebbene non ti sbagli a riguardo, Asker si sta chiedendo quale metodo recuperi una variabile dall'oggetto richiesta. @Cerad ha risposto correttamente a questa domanda. Non solo ha fornito il modo corretto di accedere all'oggetto Richiesta, ma ha anche risposto alla domanda.
Layton Everson,

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

1
Sebbene questo codice possa rispondere alla domanda, sarebbe meglio includere un certo contesto, spiegando come funziona e quando usarlo. Le risposte di solo codice non sono utili a lungo termine.
Bono,

0

Per gli utenti di symfony 4:

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

0

# Www.example / registro / admin

  /**
 * @Route("/register/{role}", name="app_register", methods={"GET"})
 */
public function register(Request $request, $role): Response
{
 echo $role ;
 }
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.