Ver índice de contenidos del libro

7.2. Configurando los botones del formulario

Las clases de formularios deberían ser agnósticas respecto a dónde se van a utilizar. De esta manera los formularios se podrán reutilizar más fácilmente.

Buena Práctica Añade los botones de los formularios en las plantillas, no en las clases de formulario o en los controladores.

Desde la versión 2.5 de Symfony es posible añadir botones como campos de tus propios formularios. La ventaja es que así se simplifica el código de la plantilla que muestra el formulario. La desventaja es que al añadir los botones al propio formulario, estás limitando su funcionalidad:

class PostType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            // ...
            ->add('save', 'submit', array('label' => 'Create Post'))
        ;
    }
 
    // ...
}

Originalmente este formulario se diseño para crear artículos del blog y por eso incluye el botón Create Post. Sin embargo, este formulario podría reutilizarse también para la acción de modificar los artículos. En este caso el texto del botón sería incorrecto, ya que no estás creando artículos sino modificándolos. Para evitar estos problemas, algunos programadores prefieren añadir los botones directamente en el controlador:

namespace AppBundle\Controller\Admin;
 
use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use AppBundle\Entity\Post;
use AppBundle\Form\PostType;
 
class PostController extends Controller
{
    // ...
 
    public function newAction(Request $request)
    {
        $post = new Post();
        $form = $this->createForm(new PostType(), $post);
        $form->add('submit', 'submit', array(
            'label' => 'Create',
            'attr'  => array('class' => 'btn btn-default pull-right')
        ));
 
        // ...
    }
}

Esta solución también es un error, ya que estás mezclando el código de las plantillas (etiquetas, clases CSS, etc.) con el código PHP puro del controlador. Separar las diferentes capas de la aplicación es una buena práctica que siempre deberías seguir. Por eso es mejor colocar todo lo relacionado con la vista en las propias plantillas:

<form method="POST" {{ form_enctype(form) }}>
    {{ form_widget(form) }}
 
    <input type="submit" value="Create"
           class="btn btn-default pull-right" />
</form>