2015-04-26 2 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