Accéder aux valeurs POST dans l’object de requête Symfony2

OK, c’est une question de débutant, mais je ne trouve la réponse nulle part. Dans un contrôleur de Symfony2, je souhaite accéder à la valeur POST depuis 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_value ne retourne rien. Qu’est-ce que je fais mal? Merci!

Symfony 2.2

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

 $form->getData(); 

vous donne un tableau pour les parameters du formulaire

extrait du livre symfony2 page 162 (Chapitre 12: Formulaires)

[…] parfois, vous pouvez simplement vouloir utiliser un formulaire sans classe et récupérer un tableau des données soumises. C’est vraiment très facile:

 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 “name”) directement via l’object request, comme ceci:

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

Soyez averti, 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 object) après leur transformation par le framework de formulaire.

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


Symfony 2.3

depuis 2.3 vous devez utiliser handleRequest au lieu de bindRequest :

  $form->handleRequest($request); 

voir la documentation

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

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

Si vous avez toujours des problèmes, essayez de faire un var_dump() sur $request->request->all() pour voir toutes les valeurs de publication.

Ce qui a fonctionné pour moi était d’utiliser ceci:

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

Il y a une astuce avec la méthode ParameterBag::get() . Vous pouvez définir le paramètre $deep sur true et accéder à la valeur nestede profonde requirejse 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 méthode get() ), elle peut éviter les isset($form['some']['deep']['data']) redondants isset($form['some']['deep']['data']) .

Les données de champ 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)

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

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

Je pense que pour obtenir les données de la requête, liées et validées par l’object formulaire, vous devez utiliser:

$form->getClientData();

Si vous êtes débutant, bienvenue à Symfony2, un projet open-source. Si vous voulez apprendre beaucoup, vous pouvez ouvrir le source!

De “Form.php”:

getData () getNormData () getViewData ()

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