Symfony 2.2, el libro oficial

12.4. Deduciendo el tipo de campo

Después de añadir los metadatos de validación a la clase Task, Symfony ya sabe alguna cosa sobre tus campos. Así que Symfony puede deducir el tipo de campo más apropiado para cada propiedad y configurarlo automáticamente. En este ejemplo, Symfony puede deducir toda la información a partir de las reglas de validación de ambos campos (task es un campo de texto normal y dueDate es un campo date):

public function newAction()
{
    $task = new Task();

    $form = $this->createFormBuilder($task)
        ->add('task')
        ->add('dueDate', null, array('widget' => 'single_text'))
        ->getForm();
}

La deducción de la información se produce cuando omites el segundo argumento del método date() o cuando le pasas null. Si pasas un array de opciones como tercer argumento (como hace por ejemplo dueDate), estas opciones redefinen cualquier opción que se haya establecido automáticamente.

Advertencia Si tu formulario utiliza una validación de grupo, al deducir el tipo y configuración de un campo se tendrán en cuenta todas las reglas de validación asociadas al campo, pertenezcan o no al grupo que estés utilizando.

12.4.1. Deduciendo las opciones de configuración del campo

Además de deducir el tipo de un campo, Symfony también puede tratar de adivinar los valores adecuados para varias opciones de configuración:

  • required: se deduce en base a las reglas de validación (si el campo es NotBlank o NotNull) o los metadatos de Doctrine (si el campo es nullableo no). Esto es muy útil, porque la validación del navegador se actualiza automáticamente con tus reglas de validación del servidor.
  • max_length: si el campo es de tipo texto, entonces la opción max_length se puede inferir a partir de las restricciones de validación (si utilizas Length o Range) o a partir de los metadatos de Doctrine (mediante la longitud del campo).

Truco Cuando se utilizan estas opciones, los campos de formulario incluyen atributos HTML especiales que activan la validación en el propio navegador. Desafortunadamente, no generan las restricciones equivalente para el lado del servidor (por ejemplo, Assert\Length).

Nota Estas opciones sólo se infieren si estás permitiendo que Symfony deduzca el tipo de campo (es decir, si no indicas el segundo argumento del método add() o si le pasas null).

Si quieres cambiar alguno de los valores inferidos, los puedes redefinir pasando la opción en el array de opciones del campo:

->add('task', null, array('max_length' => 4))