Acceder a los valores POST en el objeto de solicitud de Symfony2

93

Bien, esta es una pregunta para principiantes, pero no puedo encontrar la respuesta en ninguna parte. En un controlador en Symfony2, quiero acceder al valor POST desde uno de mis formularios. En el controlador tengo:

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

Lamentablemente $name_valueno devuelve nada. ¿Qué estoy haciendo mal? ¡Gracias!

Acyra
fuente

Respuestas:

99

Symfony 2.2

esta solución está en desuso desde 2.3 y se eliminará en 3.0, consulte la documentación

$form->getData();

le da una matriz para los parámetros del formulario

del libro de Symfony2, página 162 (Capítulo 12: Formularios)

[...] a veces, es posible que desee utilizar un formulario sin una clase y obtener una matriz de los datos enviados. Esto es realmente muy fácil:

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
}

También puede acceder a los valores POST (en este caso, "nombre") directamente a través del objeto de solicitud, así:

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

Sin embargo, tenga en cuenta que, en la mayoría de los casos, usar el método getData () es una mejor opción, ya que devuelve los datos (generalmente un objeto) después de haber sido transformados por el marco del formulario.

Cuando desee acceder al token de formulario, debe usar la respuesta de Problematic $postData = $request->request->get('contact');porque getData()elimina el elemento de la matriz


Symfony 2.3

desde 2.3 debería usar en handleRequestlugar de bindRequest:

 $form->handleRequest($request);

ver documentación

timaschew
fuente
4
Esto es genial y ahora es la mejor respuesta. $ form-> getData () no existía o no estaba documentado cuando hice la pregunta.
Acyra
4
para vincular los datos de la solicitud al formulario en las versiones más recientes, debe usar $ form-> handleRequest ($ request); en lugar de $ formulario-> enviar ($ solicitud); Yo creo que. Más detalles symfony.com/doc/2.3/book/forms.html#handling-form-submissions
adridev
127

Los valores de publicación del formulario se almacenan con el nombre del formulario en la solicitud. Por ejemplo, si anuló el getName()método de ContactType () para devolver "contacto", haría esto:

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

Si todavía tiene problemas, trate de hacer un var_dump()sobre $request->request->all()para ver todos los valores de correos.

Problemático
fuente
2
Gracias. El var_dump ayudó, terminé atacando esto con un nombre completo para recuperar los datos del formulario, por ejemplo, $ postData = $ request-> request-> get ('acme_somebundle_contact_type')
Acyra
1
Vea la respuesta de timaschew a continuación, ya que se preguntó esto, Symfony2 agregó un nuevo método: $ form-> getData ();
Acyra
2
Si ha anulado el getName(), entonces tiene sentido no codificar nombres:$request->request->get($form->getName());
meze
Gracias .. Me ahorré mucho tiempo :) Saludos !!
Anjana Silva
38

lo que funcionó para mí fue usar esto:

$data = $request->request->all();
$name = $data['form']['name'];
ramzey
fuente
Esto es lo que Problematic mencionó, + ver comentario de @meze allí
phpsherpa
17

Hay un truco con el ParameterBag::get()método. Puede establecer $deepparámetros a truey el acceso al valor anidado profundidad requerida sin la variable adicional:

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

También tiene la posibilidad de establecer un valor predeterminado (segundo parámetro del get()método), puede evitar isset($form['some']['deep']['data'])llamadas redundantes .

Dmitriy
fuente
El tercer parámetro ha quedado en desuso y se eliminó de 3.0. Nota: La búsqueda de elementos profundos está en desuso desde la versión 2.8, que se eliminará en 3.0. : github.com/symfony/symfony/blob/…
AL
8

Se puede acceder a los datos de campo en un controlador con: Listado 12-34

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

Además, los datos de un campo no mapeado también se pueden modificar directamente: Listado 12-35

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

página 164 del libro symfony2 (generado el 9 de octubre de 2013)

meteorito
fuente
7

Accedo al parámetro ticketNumber para mi solicitud de publicación de varias partes de la siguiente manera.

$data = $request->request->all();
$ticketNumber = $data["ticketNumber"];
Ilker Baltaci
fuente
1

Creo que para obtener los datos de la solicitud, vinculados y validados por el objeto de formulario, debe usar:

$form->getClientData();

Chicna
fuente
7
getClientData está en desuso. Use getData, getViewData, getNormData .... El componente Form es realmente desordenado en SF2 (realmente deberían inspirarse en el mundo Java y el genial RequestDataBinder ....)
Thomas Decaux
0

Symfony doc para obtener datos de solicitud

Finalmente, se puede acceder a los datos sin procesar enviados con el cuerpo de la solicitud usando getContent ():

$ contenido = $ solicitud-> getContent ();

Alex Joe
fuente
-14

Si eres un novato, bienvenido a Symfony2, un proyecto de código abierto, así que si quieres aprender mucho, ¡puedes abrir el código fuente!

Desde "Form.php":

getData () getNormData () getViewData ()

Puede encontrar más detalles en este archivo.

Thomas Decaux
fuente
Utilice siempre la forma Symfony, $ _POST, $ request está sucio
Thomas Decaux
Sí, no soy bueno para la explicación ^^ pero esta es exactamente la misma solución que la confirmada $form->getData();Sé que la gente es vaga y quiere una solución sin pensarlo un poco ;-(
Thomas Decaux