Symfony 2.3, el libro oficial

12.6. Modificando la acción y el método de un formulario

Hasta ahora, los ejemplos anteriores han utilizado el helper form_start() para mostrar la etiqueta HTML de apertura del formulario. Este helper supone que el formulario se envía a la misma URL que lo originó y además, que el método utilizado es POST. En ocasiones es necesario modificar estos dos parámetros, así que se van a presentar a continuación varias alternativas. Si creas el formulario en el controlador, utiliza los métodos setAction() y setMethod():

$form = $this->createFormBuilder($task)
    ->setAction($this->generateUrl('target_route'))
    ->setMethod('GET')
    ->add('task', 'text')
    ->add('dueDate', 'date')
    ->add('save', 'submit')
    ->getForm();

Nota Este ejemplo supone que has creado una ruta llamada target_route y que apunta al controlador que procesa el formulario.

Más adelante en este capítulo se explica cómo definir los formularios en sus propias clases. Si utilizas una clase de formulario en el controlador, puedes pasar la acción y el método como opciones del formulario:

$form = $this->createForm(new TaskType(), $task, array(
    'action' => $this->generateUrl('target_route'),
    'method' => 'GET',
));

Por último, también puedes redefinir la acción y el método directamente desde la plantilla, pasando sus valores a los helpers form() y form_start():

{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #}
{{ form(form, {'action': path('target_route'), 'method': 'GET'}) }}

{{ form_start(form, {'action': path('target_route'), 'method': 'GET'}) }}
<!-- src/Acme/TaskBundle/Resources/views/Default/newAction.html.php -->
<?php echo $view['form']->form($form, array(
    'action' => $view['router']->generate('target_route'),
    'method' => 'GET',
)) ?>

<?php echo $view['form']->start($form, array(
    'action' => $view['router']->generate('target_route'),
    'method' => 'GET',
)) ?>

Nota Si el método del formulario no es GET o POST, sino PUT, PATCH o DELETE, Symfony2 inserta en el formulario un campo oculto llamado _method para guardar su valor. Aunque el formulario se enviará con el método POST tradicional, el sistema de enrutamiento de Symfony2 es capaz de detectar la presencia del parámetro especial _method y por tanto, la petición se interpretará correctamente como PUT, PATCH o DELETE.