symfony 2.6 buildForm 与 createFormBuilder
symfony 2.6 buildForm versus createFormBuilder
谁能给我解释一下buildForm和CreateFormBuilder的区别?
创建表单的最佳方法是什么?我正在阅读符号日志,它使用:
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(),
您展示的第一个示例是正确的方法。为什么?
最佳实践。表单类型应该存在于它自己的命名空间中——例如 BundleName\Form\Type。这样做是更好的做法,因为您可以在应用程序中的任何地方自由地重复使用表单类型。您的表单需要的所有内容都放在一个文件中,更容易理解,不仅是您,而且将来可以为您的项目工作的人也是如此。如果需要changed/added,那将是每个开发人员应该首先寻找的地方。一旦开始向表单中添加事件侦听器、自定义验证器等,您就会明白控制器不适合定义表单。
DRY - 每个开发人员都致力于每天编写更好的代码。关于控制器的最重要的概念之一是 - 使其尽可能薄。让控制器动作只做它应该做的,仅此而已。定义表单类型后,只需几行代码即可创建和呈现表单。
回答您的第一个问题 - 不,无论您是否单独创建表单,都没有太大区别 class。关于这个问题还有很多要讨论的,但我相信这足以让您理解作为 class 的表单类型背后的想法。我对您的建议是将您的表单保存在它们自己的命名空间中。
希望这可以为您澄清一些事情。
谁能给我解释一下buildForm和CreateFormBuilder的区别? 创建表单的最佳方法是什么?我正在阅读符号日志,它使用:
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(),
您展示的第一个示例是正确的方法。为什么?
最佳实践。表单类型应该存在于它自己的命名空间中——例如 BundleName\Form\Type。这样做是更好的做法,因为您可以在应用程序中的任何地方自由地重复使用表单类型。您的表单需要的所有内容都放在一个文件中,更容易理解,不仅是您,而且将来可以为您的项目工作的人也是如此。如果需要changed/added,那将是每个开发人员应该首先寻找的地方。一旦开始向表单中添加事件侦听器、自定义验证器等,您就会明白控制器不适合定义表单。
DRY - 每个开发人员都致力于每天编写更好的代码。关于控制器的最重要的概念之一是 - 使其尽可能薄。让控制器动作只做它应该做的,仅此而已。定义表单类型后,只需几行代码即可创建和呈现表单。
回答您的第一个问题 - 不,无论您是否单独创建表单,都没有太大区别 class。关于这个问题还有很多要讨论的,但我相信这足以让您理解作为 class 的表单类型背后的想法。我对您的建议是将您的表单保存在它们自己的命名空间中。
希望这可以为您澄清一些事情。