如何改变表单的Action和Method

3.4 版本
维护中的版本

默认情况下,表单想要提交,需要将一个HTTP的POST请求,提交到这个被渲染表单的同一URL下。有时你想改变这些参数。你有一些不同的方法可以实现它。

如果你使用FormBuilder去构建你的表单,你就可以使用setAction()setMethod()

1
2
3
4
5
6
7
$form = $this->createFormBuilder($task)
    ->setAction($this->generateUrl('target_route'))
    ->setMethod('GET')
    ->add('task', TextType::class)
    ->add('dueDate', DateType::class)
    ->add('save', SubmitType::class)
    ->getForm();

这个例子假设您已经创建了一个名为target_route的路由,指向处理表单的控制器。

当使用表单类型类时,你就能够把action和method作为表单配置传入:

1
2
3
4
5
6
7
use AppBundle\Form\Type\TaskType;
// ...
 
$form = $this->createForm(TaskType::class, $task, array(
    'action' => $this->generateUrl('target_route'),
    'method' => 'GET',
));

最后,你可以通过form()form_start()去覆盖模版中的action和method:

1
2
{# app/Resources/views/default/new.html.twig #}
{{ form_start(form, {'action': path('target_route'), 'method': 'GET'}) }}
1
2
3
4
5
<!-- app/Resources/views/default/newAction.html.php -->
<?php echo $view['form']->start($form, array(
    'action' => $view['router']->path('target_route'),
    'method' => 'GET',
)) ?>

如果这些表单方法不是GET或者POST,但是是PUT、PATCH和DELETE,那么symfony会插入一个名字为_method的隐藏字段来存储方法。如果form表单提交一个普通的POST请求,symfony路由会检测_method参数并解析PUT、PATCH和DELETE请求。参见http_method_override选项。

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)