有人可以解释一下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(),
答案 0 :(得分:3)
您展示的第一个示例是正确的方法。为什么呢?
最佳做法。表单类型应该存在于自己的命名空间中 - 例如 BundleName \ Form \ Type 。这样做是一种更好的做法,因为您可以随意在应用程序中的任何位置重复使用表单类型。您的表单所需的一切都放在一个文件中,更易于理解,不仅仅是您,也可以是将来可以处理您项目的人。如果需要更改/添加某些内容,这将是每个开发人员应该寻找的第一个地方。一旦开始在表单中添加事件侦听器,自定义验证器等,您就会明白控制器不适合定义表单。
DRY - 每个开发人员都希望每天编写更好的代码。关于控制器的最重要概念之一是 - 尽可能保持薄。让控制器动作只做它应该做的事情,仅此而已。一旦您的表单类型被定义,那么创建和呈现表单只需几行。
回答你的第一个问题 - 不,没有太大的区别,无论你是否在单独的课堂上创建你的表格。关于这个问题还有很多讨论,但我相信这足以让你理解作为一个类的表单类型背后的想法。我的建议是将表单保存在自己的命名空间中。
希望这可以为你澄清一些事情。