Comment obtenir les paramètres de requête dans symfony2

203

Je suis très nouveau sur symfony. Dans d'autres langues comme Java et d'autres, je peux utiliserrequest.getParameter('parmeter name') pour obtenir la valeur.

Y a-t-il quelque chose de similaire que nous pouvons faire avec symfony2.
J'ai vu quelques exemples mais aucun ne fonctionne pour moi. Supposons que j'ai un champ de formulaire avec le nom username . Dans l'action de formulaire, j'ai essayé d'utiliser quelque chose comme ceci:

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

J'ai aussi essayé

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

et

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

Mais aucune des options ne fonctionne, mais ce qui suit a bien fonctionné:

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

Où est-ce que je me trompe dans l'utilisation de la getParameter()méthode. Toute aide serait appréciée.

Abdul Hamid
la source
Vous avez une faute de frappe à la ligne deux: $request->request-get()devrait l'être $request->request->get(). Serait-ce possible?
halfer
ont écrit la même chose dans le code.mis ici.désolé pour la faute de frappe ici.encore cela ne fonctionne pas.
Abdul Hamid
Avez-vous (a) vérifié le manuel pour vous assurer qu'il get()s'agit de la bonne méthode et (b) activé les notifications PHP afin de voir s'il y a des problèmes? (c) Symfony 2 a-t-il une barre d'outils de débogage comme symfony 1, donc vous pouvez voir si vous avez fait des erreurs?
halfer
Confondez-vous le prénom et le nom d'utilisateur?
greg0ire
Il y a plus d'informations ici: roadtodev.com/recuperer-objet-request-de-symfony
Thomas Bredillet

Réponses:

416

La dénomination n'est pas du tout intuitive:

use Symfony\Component\HttpFoundation\Request;

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

    // $_POST parameters
    $request->request->get('name');
Cerad
la source
46
C'est différent de ce que PHP utilise, mais cela a plus de sens. $_GETles données sont des données de la chaîne de requête (aucune GETdemande nécessaire du tout) et les $_POSTdonnées sont des données du corps de la demande (ne doit pas nécessairement être une POSTdemande non plus, pourrait l'être PUT).
igorw
5
essayé $ request-> query-> get ('name'); mais cela ne fonctionne pas non plus.
Abdul Hamid
7
Comment puis-je obtenir les paramètres d'une demande PUT?
Tjorriemorrie
10
Un nom très étrange ici, sûrement $request->getet $request->postserait plus simple.
crmpicco
3
le commentaire d'igorw clarifie cette convention de nommage bizarre
Dheeraj
32

Je le fais encore plus simple:

use Symfony\Component\HttpFoundation\Request;

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

Une autre option consiste à introduire vos paramètres dans votre définition de fonction d'action:

use Symfony\Component\HttpFoundation\Request;

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

qui, puis suppose que vous avez défini {foo} et {bar} dans le cadre de votre modèle d'URL dans votre fichier routing.yml:

acme_myurl:
    pattern:  /acme/news/{foo}/{bar}
    defaults: { _controller: AcmeBundle:Default:getnews }
pkout
la source
et dans le premier exemple, si j'ai un fooparamètre à la fois dans la chaîne de requête et dans le corps POST, lequel sera retourné $request->get('foo')?
Dimitry K
1
On dirait que la priorité est GET, PATH, POST api.symfony.com/master/Symfony/Component/HttpFoundation/…
Dimitry K
Ceci est la meilleure réponse
propulsé par vapeur le
7
Non ce n'est pas. La documentation de la méthode elle-même indique qu'il est déconseillé de l'utiliser car elle est plus lourde que l'accès aux paramètres GET / POST via leurs collections spécifiques.
jurchiks
1
La réponse est des $request->get('foo'); œuvres correctes pour TOUS les sacs (la commande est: CHEMIN, OBTENIR, POSTER). Néanmoins, $request->request->get('foo');ne fonctionne que pour le sac POST. Enfin, le premier ( $request->get()) n'est pas recommandé si nous savons où se trouvent les données (GET / POST).
F2000
18

Vous pouvez utiliser le code suivant pour obtenir les valeurs de votre champ de formulaire

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

Ou Vous pouvez également obtenir toutes les valeurs du formulaire sous forme de tableau à l'aide de

$request->request->all()
Scorpion
la source
3
$ request-> request-> all () fonctionne pour moi mais quelque chose comme $ request-> query-> get ('foo'); ne fonctionne pas.
Abdul Hamid
13

essayer

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

inspecter le nom d'attribut de votre champ de formulaire

MartinW.
la source
1
+1, car je pense que de toutes les réponses, seule celle-ci indique la chose non évidente - dans les cas où vous avez créé vos formulaires automatiquement avec l'aide du générateur de formulaires de symfony, symfony renomme le champ du formulaire en quelque chose de plus que vous ne le feriez attendre. Comme name = "acme_demobundle_userform [field_name]"
userfuser
La syntaxe que vous avez mentionnée ici ne fonctionne pas avec php 5.3.10. Quelle est la version minimale pour prendre en charge cela?
Justinas Lelys
2
@justinasLelys try $ userType = $ request-> request-> get ('acme_demobundle_usertype'); $ username = $ userType ['username'];
sleep-er
@JustinasLelys Syntax is PHP 5.4
COil
"nom d'utilisateur" ne peut pas être défini. Il vaut donc mieux vérifier avec "??" première.
Viktor Sydorenko
9

À l'intérieur d'un contrôleur:

$request = $this->getRequest();
$username = $request->get('username');
Reinherd
la source
6
Dans les versions plus récentes de Symfony, $this->getRequest()est déconseillé, en faveur de l'injection de la demande dans l'action du contrôleur, par exemple:public function showAction(Request $request, $id);
Adam Elsodaney
9

Vos options:

  1. Facile:
    • $request->request->get('param')( $_POST['param']) ou
    • $request->query->get('param')( $_GET['param'])
  2. Bons formulaires Symfony avec toutes les validations, transormations de valeurs et rendus de formulaires avec des erreurs et de nombreuses autres fonctionnalités:
  3. Quelque chose entre les deux (voir l'exemple ci-dessous)
<?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,
    ]);
}

En savoir plus OptionsResolver- http://symfony.com/doc/current/components/options_resolver.html

luchaninov
la source
8

Comme la $this->getRequest()méthode est maintenant obsolète, vous devez injecter un Requestobjet dans votre action de contrôleur comme ceci:

public function someAction(Request $request)

après cela, vous pouvez utiliser l'une des options suivantes.

Si vous souhaitez extraire les données POST de la demande, utilisez ce qui suit:

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

mais si vous voulez récupérer les données GET de la demande, utilisez ceci:

$request->query->get('var_name');
Ashish Awasthi
la source
6

Vous pouvez le faire:

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

Parfois, lorsque les attributs sont protégés, vous ne pouvez pas avoir accès pour obtenir la valeur de la méthode d'accès courante:

(PUBLIER)

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

(AVOIR)

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

(GÉNÉRIQUE)

$clientName = $request->get('clientName');
Yoander
la source
1
Bienvenue dans Stack Overflow. Veuillez formater votre réponse pour la rendre plus lisible la prochaine fois et consultez également cette page d'aide: Comment répondre
Fabian Horlacher
et s'il y a 2 valeurs après get? comme ça$clientName = $request->query->get('clientName','any');
Munkhdelger Tumenbayar
3

La plupart des cas, comme l'obtention de paramètres de chaîne ou de formulaire de requête, sont traités dans les réponses ci-dessus.

Lorsque vous travaillez avec des données brutes, comme une chaîne JSON brute dans le corps que vous souhaitez donner comme argument json_decode(), la méthode Request::getContent()peut être utilisée.

$content = $request->getContent();

Des informations utiles supplémentaires sur les requêtes HTTP dans Symfony peuvent être trouvées dans la documentation du paquet HttpFoundation .

Antonis Charalambous
la source
1
$request = Request::createFromGlobals();
$getParameter = $request->get('getParameter');
Manuel M.
la source
Est-ce encore le chemin à parcourir pour les fonctions qui n'ont pas le Requestparamètre? (par exemple dans les fonctions privées de la classe de contrôleur par exemple)
fritzmg
1
use Symfony\Component\HttpFoundation\Request;

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

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

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

}

Merci, vous pouvez également utiliser le code ci-dessus

Rencontrer
la source
0

Si vous avez besoin d'obtenir la valeur d'une sélection, vous pouvez utiliser:

$form->get('nameSelect')->getClientData();
sncardonam
la source
0

Essayez ça, ça marche

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

Cordialement

AchrafSoltani
la source
Cela ne répond pas du tout à la question. La personne qui pose la question a déjà accès à l'objet de demande.
Layton Everson
1
@LaytonEverson désolé mais vous vous trompez, sa méthode // $ this-> getRequest () est obsolète depuis 2.4, c'est pourquoi cela ne fonctionne pas, donc il n'a pas vraiment accès à l'objet request;)
AchrafSoltani
Bien que vous ne vous soyez pas trompé à ce sujet, le demandeur se demande quelle méthode récupère les variables de l'objet de demande. @Cerad a répondu à cette question correctement. Non seulement il a fourni la bonne façon d'accéder à l'objet Request, mais il a également répondu à la question.
Layton Everson
0
public function indexAction(Request $request)
{
   $data = $request->get('corresponding_arg');
   // this also works
   $data1 = $request->query->get('corresponding_arg1');
}
abhinand
la source
1
Bien que ce code puisse répondre à la question, il serait préférable d'inclure un certain contexte, expliquant comment il fonctionne et quand l'utiliser. Les réponses uniquement codées ne sont pas utiles à long terme.
Bono
0

Pour les utilisateurs de symfony 4:

$query = $request->query->get('query');
Forgeron
la source
0

# www.example / register / admin

  /**
 * @Route("/register/{role}", name="app_register", methods={"GET"})
 */
public function register(Request $request, $role): Response
{
 echo $role ;
 }
Khandaker Toihidul Islam
la source