2015-04-26 28 views
0

有人可以解釋我之間的區別buildForm和CreateFormBuilder? 什麼是創建表單的最佳方式?我讀symblog它使用:symfony 2.6 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(), 

回答

2

還有你的第一個例子是做正確的方式。爲什麼?

  • 最佳做法。表單類型應該存在於其自己的名稱空間中 - 例如BundleName \ Form \ Type。這樣做是一種更好的做法,因爲您可以隨意在應用程序中的任何位置重新使用表單類型。您的表單需要的所有內容都放在一個文件中,更容易理解,不僅僅是由您,也是由將來可以在您的項目中工作的人員。這將是每個開發人員應該查找的第一個地方,如果需要更改/添加。一旦你開始添加事件監聽器,自定義驗證器等等,你就會明白控制器不適合定義表單的地方。

  • DRY - 每個開發人員都致力於每天編寫更好的代碼。關於控制器最重要的概念之一是 - 儘可能保持薄。讓控制器行動只做它應該做的事情,除此之外別無其他。一旦你的表單類型被定義,那麼它只需要幾行代碼來創建和呈現你的表單。

要回答你的第一個問題 - 不,沒有太大的區別,不管你是否在單獨的課堂上創建你的表單。關於這個問題還有很多需要討論,但我相信這足以讓你理解表單類型作爲一個類的想法。我對你的建議是將你的表單保存在自己的名字空間中。

希望這可以爲你澄清事情。

+0

謝謝!!有很多symfony的文檔,但沒有像你的詳細解釋。 ! – stackdave

+0

一個問題:爲什麼兩種方式都不用:使用Symfony \ Component \ Form \ FormBuilder;或者是一種新的方式使用Symfony \ Component \ Form \ FormBuilderInterface;但在symfony文檔的例子中,只需使用:使用Symfony \ Component \ HttpFoundation \ Request; – stackdave

+0

Becasue'$ this-> createFormBuilder()'是一個來自Symfony控制器的快捷方式。至於第二個,表單類型擴展了特定的類。 – Artamiel