symfony 2.6 buildForm与createFormBuilder
有人能告诉我buildForm和CreateFormBuilder的区别吗? 创建表单的最佳方式是什么?我正在阅读symblog,它使用: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
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(),