2016-03-02 1 views
2

В Symfony 3, если вы хотите создать форму как услугу, чтобы вы могли вводить сервисы или аргументы, вы можете сделать это только один раз.Symfony 3 - Forms as Services Issue

То, что я хотел сделать, есть 2 формы в виде сервисов, которые используют один и тот же класс формы типа, но принимать различные аргументы, чтобы позволить мне установить группы проверки использования:

services: 
    add_page: 
    class: BackendContent\Form\PageType 
    arguments: [ "add" ] 
    tags: 
     - { name: form.type } 
    edit_page: 
    class: BackendContent\Form\PageType 
    arguments: [ "edit" ] 
    tags: 
     - { name: form.type } 

Но когда я иду и создать форма в мой контроллер, все, что я могу сделать, это использовать FQCN и не использовать псевдоним вида и т.д.:

$form = $this->container->get('form.factory')->createForm(PageType::class); 

Это только позволит мне использовать один из definations услуг.

Единственный способ обойти это создает 2 формы и расширения формы 1 PageType поэтому я затем, AddPageType, EditPageType и PageType, который я действительно не хотел делать.

У кого-нибудь есть решение этой проблемы?

Извините, если это то, что я упустил, но я не могу найти что-либо в документах.

Спасибо!

ответ

0

Единственный способ обойти это для меня является создание еще 2 классов, называемых AddPageType и EditPageType, расширяя класс PageType и просто устанавливая группу проверки в каждом из классов Add/Edit.

Это прекрасно работает при использовании услуг, но это не идеально.

services: 
    add_page: 
    class: BackendContent\Form\AddPageType #this extends the PageType class 
    tags: 
     - { name: form.type } 
    edit_page: 
    class: BackendContent\Form\EditPageType #this extends the PageType class 
    tags: 
     - { name: form.type } 

Теперь, когда я создаю форму в моем контроллере я могу назвать это так:

$form = $this->container->get('form.factory')->createForm(AddPageType::class); 

Это должно от того, что я прочитал/сказали, от других, вводить какие-либо услуги и т.д. в моем классе потому что он находится в сервисах.

Любое дальнейшее понимание этого приветствуется!

1

Если ваш тип формы отличается от «add» и «edit», вы должны использовать 2 типа форм: AddPageType и EditPageType.

Если изменилось только какое-то поведение, вы должны использовать опцию типа типа для своих пользовательских типов.

Это не имеет особого смысла использовать один и тот же класс формы типа для 2-х различных форм, поэтому это уже не возможно в Symfony 3.

+1

Источник почему это не имеет смысла иметь один класс с несколькими псевдонимами формы? Особенно учитывая, что это действительно довольно широко используемый метод? – Cerad

+0

Действительно? Когда поля формы все одинаковы? DRY приходит на ум. Моя единственная разница в том, что он говорит, какой набор правил валидации следует использовать. Зачем мне несколько раз занимать классы форм? – coder4show

+0

@ coder4show вы можете настроить такие вещи, используя параметры формы.Более того, если вы установите опцию 'validation_groups' вашего настраиваемого типа формы, я верю, что все ее дочерние элементы наследуют ее автоматически. –

0

Вы можете установить группы проверки в configureOptions формы, например:

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults([ 
     'data_class' => Page::class, 
     'validation_groups' => function (FormInterface $form) { 
      $data = $form->getData(); 

      // if page exists, apply your own logic here 
      if ($data->getId()) { 
       return ['edit']; 
      } 

      return ['add']; 
     } 
    ]); 
}