2011-08-02 25 views
80

OK, esta es una pregunta para principiantes, pero no puedo encontrar la respuesta en ningún lado. En un controlador en Symfony2, quiero acceder al valor POST desde uno de mis formularios. En el controlador que tengo:Acceso a valores POST en el objeto de solicitud Symfony2

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

Desafortunadamente $name_value no devuelve nada. ¿Qué estoy haciendo mal? ¡Gracias!

Respuesta

87

Symfony 2.2

esta solución está obsoleta desde 2.3 y se eliminará en 3,0, see documentation

$form->getData(); 

le da una matriz para los parámetros de forma

de symfony2 book página 162 (capítulo 12 : Formularios)

[...] a veces, es posible que desee utilizar un formulario sin clase y obtener una matriz o f 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 de la POST (en este caso "nombre") directamente a través del objeto de la petición, así:

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

Tenga en cuenta, sin embargo, 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 que el marco de formulario los ha transformado.

Cuando desee acceder a la señal formulario, usted tiene que utilizar la respuesta de la Problemática $postData = $request->request->get('contact'); porque el getData() elimina el elemento de la matriz


Symfony 2,3

desde 2.3 debe usar handleRequest en lugar de bindRequest:

$form->handleRequest($request); 

see documentation

+4

Esto es genial, y ahora es la mejor respuesta. $ form-> getData() didn ' Existe o no estaba documentado cuando hice la pregunta. – Acyra

+4

para vincular los datos de solicitud para formar en las versiones más recientes, debe usar $ form-> handleRequest ($ request); en lugar de $ form-> submit ($ r equest); creo. Más detalles http://symfony.com/doc/2.3/book/forms.html#handling-form-submissions – adridev

113

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

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

Si todavía tiene problemas, trate de hacer un var_dump() en $request->request->all() para ver todo los valores de publicación.

+2

Gracias. El var_dump ayudó, terminé atacando esto con un nombre completo para recuperar los datos del formulario, p. $ postData = $ request-> request-> get ('acme_somebundle_contact_type') – Acyra

+1

Vea la respuesta de timaschew a continuación, ya que se le preguntó, Symfony2 agregó un nuevo método: $ form-> getData(); – Acyra

+2

Si ha reemplazado el 'getName()', entonces tiene sentido no codificar los nombres: '$ request-> request-> get ($ form-> getName());' – meze

1

creo que con el fin de obtener los datos de la solicitud, con destino y validados por el objeto de formulario, debe utilizar:

$form->getClientData();

+7

getClientData está en desuso. Use getData, getViewData, getNormData ... El componente Form es realmente complicado en SF2 (deberían inspirarse en el mundo de Java y en el fresco RequestDataBinder ...) –

36

lo que funcionó para mí estaba usando esto:

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

Esto es lo que mencionó Problematic, + ver el comentario de @meze allí – phpsherpa

-13

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

De "form.php":

getData() getNormData() getViewData()

Puede encontrar más detalles en este archivo.

+0

Usa siempre el modo Symfony, $ _POST, $ request está sucio –

+0

jaja esta respuesta no tiene sentido :) – Sliq

+0

Sí, no soy bueno para la explicación ^^ pero esta es exactamente la misma solución que la que se confirmó '' $ form- > getData(); '' Sé que la gente es floja y quiere una solución sin pensar un poco ;-( –

17

Hay un truco con ParameterBag::get() método. Puede establecer $deep parameter a true y acceder al valor anidado profundidad requerida sin la variable adicional:

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

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

+0

El tercer parámetro ha quedado obsoleto y se ha eliminado de 3.0 _Nota: la búsqueda de elementos profundos está en desuso desde la versión 2.8, que debe eliminarse en 3.0._: https: // github.com/symfony/symfony/blob/351b234f0791727054e95040d3c28cf3d772c9a9/src/Symfony/Component/HttpFoundation/ParameterBag.php # L77 –

8

Los datos de campo se puede acceder en un controlador con: Listado 12-34

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

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

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

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

2

I al parámetro ticketNumber para mi multiparte posterior r equest de la siguiente manera.

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