symfony 2.6 buildForm与createFormBuilder

时间:2015-04-26 17:44:29

标签: symfony formbuilder

有人可以解释一下buildForm和CreateFormBuilder之间的区别吗? 创建表单的最佳方法是什么?我正在阅读symblog,它使用:

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
class EnquiryType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name');
        $builder->add('email', 'email');
        $builder->add('subject');
        $builder->add('body', 'textarea');

但在文档symfony中我发现使用“createFormBuilder”

// src/Acme/TaskBundle/Controller/DefaultController.php
namespace Acme\TaskBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
class DefaultController extends Controller
{
    public function newAction(Request $request)
    {
        // createFormBuilder is a shortcut to get the "form factory"
        // and then call "createBuilder()" on it
        $form = $this->createFormBuilder()
            ->add('task', 'text')
            ->add('dueDate', 'date')
            ->getForm();
        return $this->render('AcmeTaskBundle:Default:new.html.twig', array(
            'form' => $form->createView(),

1 个答案:

答案 0 :(得分:3)

您展示的第一个示例是正确的方法。为什么呢?

  • 最佳做法。表单类型应该存在于自己的命名空间中 - 例如 BundleName \ Form \ Type 。这样做是一种更好的做法,因为您可以随意在应用程序中的任何位置重复使用表单类型。您的表单所需的一切都放在一个文件中,更易于理解,不仅仅是您,也可以是将来可以处理您项目的人。如果需要更改/添加某些内容,这将是每个开发人员应该寻找的第一个地方。一旦开始在表单中添加事件侦听器,自定义验证器等,您就会明白控制器不适合定义表单。

  • DRY - 每个开发人员都希望每天编写更好的代码。关于控制器的最重要概念之一是 - 尽可能保持薄。让控制器动作只做它应该做的事情,仅此而已。一旦您的表单类型被定义,那么创建和呈现表单只需几行。

回答你的第一个问题 - 不,没有太大的区别,无论你是否在单独的课堂上创建你的表格。关于这个问题还有很多讨论,但我相信这足以让你理解作为一个类的表单类型背后的想法。我的建议是将表单保​​存在自己的命名空间中。

希望这可以为你澄清一些事情。