2016-03-02 21 views
2

在Symfony 3中,如果你想創建一個表單作爲服務,所以你可以注入服務或參數,你只能做一次。Symfony 3 - 作爲服務的表單問題

我想要做的是有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個網頁類型的形式,所以我再有,AddPageTypeEditPageType網頁類型,我真的不希望這樣做。

有沒有人有解決這個問題的辦法?

對不起,如果這是我忽略的東西,但我無法在文檔中找到任何東西。

謝謝!

回答

0

不再可能解決這個問題的唯一辦法,我正在創造另一個2班叫AddPageType和EditPageType,擴展PageType類,並在每個添加/編輯類中設置驗證組。

現在使用這些服務時,它可以正常工作,但它並不理想。

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

如果您的表單類型因「添加」和「編輯」而異,則應使用2種表單類型:AddPageTypeEditPageType

如果只有一些行爲發生了變化,您應該使用自定義類型的表單類型選項。

它沒有多大意義,使用相同的表單類型類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']; 
     } 
    ]); 
}