Symfony 2.3, el libro oficial

12.13. Usando un formulario sin clase

Los formularios están casi siempre asociados a un objeto, cuyas propiedades se asocian a los campos del formulario. Esto es exactamente lo que se ha visto hasta ahora en este capítulo con la clase Task.

No obstante, en ocasiones puede que necesites utilizar un formulario sin una clase, y obtener un array de los datos enviados por el usuario. El siguiente ejemplo muestra cómo puedes hacerlo:

// asegúrate de importar el espacio de nombres Request
use Symfony\Component\HttpFoundation\Request;
// ...

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')
        ->add('send', 'submit')
        ->getForm();

    $form->handleRequest($request);

    if ($form->isValid()) {
        // data es un array con claves 'name', 'email', y 'message'
        $data = $form->getData();
    }

    // ... renderiza el formulario ...
}

Por omisión, los formularios suponen que quieres trabajar con arrays de datos en vez de con objetos. Existen dos maneras de cambiar este comportamiento para asociar los datos a un objeto:

  1. Pasa un objeto al crear el formulario (como primer argumento de createFormBuilder o segundo argumento de createForm);
  2. Declara la opción data_class en tu formulario.

Si no haces ninguna de estas dos cosas, entonces el formulario devolverá los datos como un array. En este ejemplo, como $defaultData no es un objeto (y no se ha establecido la opción data_class), el método $form->getData(), devuelve un array.

Truco También puedes acceder a los valores POST (en este caso name) directamente a través del objeto Request, de la siguiente manera:

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

No obstante, ten en cuenta que en la mayoría de los casos es mejor utilizar el método getData(), ya que devuelve los datos (generalmente un objeto), después de que el componente de formularios los haya transformado.

12.13.1.  Añadiendo la validación

Lo único que le falta a todos los formularios anteriores es la validación. Por lo general, cuando llamas a $form->isValid(), el objeto es validado aplicando las restricciones que añadiste a esa clase. Si tu formulario está asociado a un objeto (es decir, si utilizas la opción data_class o si pasas un objeto al formulario) este es el comportamiento normal esperado.

Pero si el formulario no está asociado a ningún objeto y simplemente quieres obtener un array normal con todos los datos enviados, ¿cómo es posible validar en este caso la información del formulario?

La respuesta es configurar las restricciones a mano y añadirlas al formulario. La idea está mejor explicada en el capítulo de validación de este mismo libro, pero a continuación se muestra un ejemplo sencillo:

use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;

$builder
   ->add('firstName', 'text', array(
       'constraints' => new Length(array('min' => 3)),
   ))
   ->add('lastName', 'text', array(
       'constraints' => array(
           new NotBlank(),
           new Length(array('min' => 3)),
       ),
   ))
;

Truco Si utilizas grupos de validación, debes referenciar al grupo Default cuando crees el formulario o debes establecer el grupo o grupos cuando añadas una restricción:

new NotBlank(array('groups' => array('create', 'update'))