Ver índice de contenidos del libro

7.1. Creando los formularios

Buena Práctica Define los formularios como clases PHP.

El componente Form permite crear los formularios directamente dentro de los controladores. Si el formulario es pequeño y no vas a reutilizarlo nunca, no es incorrecto definirlo dentro del propio controlador. Pero para formularios complejos que se reutilizan en muchas partes de la aplicación, es recomendable definir cada formulario en su propia clase PHP:

namespace AppBundle\Form;
 
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
 
class PostType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add('summary', 'textarea')
            ->add('content', 'textarea')
            ->add('authorEmail', 'email')
            ->add('publishedAt', 'datetime')
        ;
    }
 
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Post'
        ));
    }
 
    public function getName()
    {
        return 'post';
    }
}

Para utilizar esta clase en un controlador, emplea el atajo createForm e instancia una nueva clase de tipo formulario:

use AppBundle\Form\PostType;
// ...
 
public function newAction(Request $request)
{
    $post = new Post();
    $form = $this->createForm(new PostType(), $post);
 
    // ...
}

7.1.1. Registrando formularios como servicios

Symfony permite registrar los formularios como servicios, pero no lo recomendamos a menos que vayas a reutilizar ese tipo de formulario en muchos sitios diferentes o vayas a embeberlo dentro de otros formularios mediante el tipo "collection".

En la mayoría de los casos, los formularios solamente se utilizan para crear o modificar información, por lo que registrarlos como servicios es totalmente innecesario. Además, esto hace que sea más difícil saber exactamente qué clase de formulario se está utilizando dentro del controlador.