symfony 2.6 buildForm与createFormBuilder

symfony 2.6 buildForm与createFormBuilder,symfony,formbuilder,Symfony,Formbuilder,有人能告诉我buildForm和CreateFormBuilder的区别吗? 创建表单的最佳方式是什么?我正在阅读symblog,它使用: use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; class EnquiryType extends AbstractType { public function buildForm(FormBuilderInterface $b

有人能告诉我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”的用法


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

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

  • DRY-每个开发人员都致力于每天编写更好的代码。关于控制器的一个最重要的概念是-使其尽可能薄。让控制器操作只执行它应该执行的操作,不多也不少。一旦定义了表单类型,那么创建和呈现表单只需几行即可

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


希望这能为您澄清一些事情。

谢谢!!有很多symfony的文档,但没有像你这样详细的解释!一个问题:为什么两种方法都不使用:使用Symfony\Component\Form\FormBuilder;或者是一种使用Symfony\Component\Form\FormBuilderInterface的新方法;但在symfony文档的示例中,只需使用:使用symfony\Component\HttpFoundation\Request;因为
$this->createFormBuilder()
是一个快捷方式,它来自于您扩展的Symfony控制器。至于第二个,表单类型扩展了特定的类。在不明显的情况下需要添加一些内容。大多数示例显示了CRUD类型代码,其中表单数据类选项指向一个条令实体。不要忘记data_类可以是任何普通的老PHP对象。我发现,如果我总是在表单后面创建一个对象,即使表单非常简单,没有连接到实体,也能保持整洁。然后验证进入对象,而不是表单上的“约束”,这是可能的,但不是真正正确的位置。
// 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(),