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!

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


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.


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

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 .


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)


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"];

1

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

$form->getClientData();


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


-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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.