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')
->getForm();
if ($request->isMethod('POST')) {
$form->bind($request);
// 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 objteos. Existen dos maneras de cambiar este comportamiento para asociar los datos a un objeto:
- Pasa un objeto al crear el formulario (como primer argumento de
createFormBuilder
o segundo argumento decreateForm
); - 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.12.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 obtiene la información enviada por el usuario en forma de array, ¿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'))