Accéder aux valeurs POST dans l'objet de requête Symfony2


93

OK, c'est une question pour les débutants, mais je ne trouve la réponse nulle part. Dans un contrôleur dans Symfony2, je souhaite accéder à la valeur POST à ​​partir de l'un de mes formulaires. Dans le contrôleur, j'ai:

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

Malheureusement, $name_valuene retourne rien. Qu'est-ce que je fais mal? Merci!

Réponses:


99

Symfony 2.2

cette solution est obsolète depuis 2.3 et sera supprimée en 3.0, voir documentation

$form->getData();

vous donne un tableau pour les paramètres du formulaire

à partir de la page 162 du livre symfony2 (Chapitre 12: Formulaires)

[...] parfois, vous voudrez peut-être simplement utiliser un formulaire sans classe et récupérer un tableau des données soumises. C'est en fait très simple:

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
}

Vous pouvez également accéder aux valeurs POST (dans ce cas "nom") directement via l'objet de requête, comme ceci:

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

Sachez cependant que dans la plupart des cas, l'utilisation de la méthode getData () est un meilleur choix, car elle renvoie les données (généralement un objet) après avoir été transformées par le framework de formulaire.

Lorsque vous souhaitez accéder au jeton de formulaire, vous devez utiliser la réponse de Problematic $postData = $request->request->get('contact');car le getData()supprime l'élément du tableau


Symfony 2.3

depuis 2.3, vous devriez utiliser à la handleRequestplace de bindRequest:

 $form->handleRequest($request);

voir la documentation


4
C'est génial, et c'est maintenant la meilleure réponse. $ form-> getData () n'existait pas ou n'était pas documenté lorsque j'ai posé la question.
Acyra

4
pour lier les données de requête au formulaire dans les versions les plus récentes, vous devez utiliser $ form-> handleRequest ($ request); au lieu de $ form-> submit ($ request); je pense. Plus de détails symfony.com/doc/2.3/book/forms.html#handling-form-submissions
adridev

127

Les valeurs de publication du formulaire sont stockées sous le nom du formulaire dans la demande. Par exemple, si vous avez remplacé la getName()méthode de ContactType () pour renvoyer "contact", procédez comme suit:

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

Si vous ne parvenez toujours pas, essayez de faire un var_dump()sur $request->request->all()pour voir toutes les valeurs de poste.


2
Je vous remercie. Le var_dump a aidé, j'ai fini par attaquer cela avec un nom complet pour récupérer les données du formulaire, par exemple $ postData = $ request-> request-> get ('acme_somebundle_contact_type')
Acyra

1
Voir la réponse de timaschew ci-dessous, puisque cela a été demandé, Symfony2 a ajouté une nouvelle méthode: $ form-> getData ();
Acyra

2
Si vous avez remplacé le getName(), alors il est logique de ne pas coder en dur les noms:$request->request->get($form->getName());
meze

Merci .. J'ai économisé beaucoup de temps :) Cheers !!
Anjana Silva

38

ce qui a fonctionné pour moi était d'utiliser ceci:

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

C'est ce que Problematic a mentionné, + voir le commentaire de @meze là
phpsherpa

17

Il y a une astuce avec la ParameterBag::get()méthode. Vous pouvez définir le $deepparamètre à trueet accéder à la valeur imbriquée profonde requise sans variable supplémentaire:

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

Vous avez également la possibilité de définir une valeur par défaut (2ème paramètre de la get()méthode), cela peut éviter les isset($form['some']['deep']['data'])appels redondants .


Le troisième paramètre est obsolète et supprimé de la version 3.0. Remarque: la recherche d'éléments profonds est obsolète depuis la version 2.8, à supprimer dans la version 3.0. : github.com/symfony/symfony/blob/…
AL

8

Les données de terrain sont accessibles dans un contrôleur avec: Listing 12-34

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

De plus, les données d'un champ non mappé peuvent également être modifiées directement: Listing 12-35

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

page 164 livre symfony2 (généré le 9 octobre 2013)


7

J'accède au paramètre ticketNumber pour ma demande de publication en plusieurs parties de la manière suivante.

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

1

Je pense que pour obtenir les données de la demande, liées et validées par l'objet de formulaire, vous devez utiliser:

$form->getClientData();


7
getClientData est obsolète. Utilisez getData, getViewData, getNormData .... Le composant Form est vraiment compliqué dans SF2 (ils devraient vraiment s'inspirer du monde Java et du cool RequestDataBinder ....)
Thomas Decaux

0

Symfony doc pour obtenir des données de demande

Enfin, les données brutes envoyées avec le corps de la requête sont accessibles en utilisant getContent ():

$ content = $ request-> getContent ();


-14

Si vous êtes novice, bienvenue sur Symfony2, un projet open-source donc si vous voulez en apprendre beaucoup, vous pouvez ouvrir le source!

Depuis "Form.php":

getData () getNormData () getViewData ()

Vous pouvez trouver plus de détails dans ce fichier.


Utilisez toujours la méthode Symfony, $ _POST, $ request is dirty
Thomas Decaux

Ouais je ne suis pas bon pour l'explication ^^ mais c'est exactement la même solution que celle confirmée $form->getData();Je sais que les gens sont paresseux et veulent une solution sans réfléchir un peu ;-(
Thomas Decaux
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.