2015-10-31 25 views
13

在我的Symfony 3主項目,我用這個代碼在一個控制器來創建表單:Symfony的3 - 定義形式作爲服務

$form = $this->createForm(ApplicantType::class, $applicant); 

現在,我決定做一個服務了這種形式,所以我可以在裏面使用EntityManager。因此,在Symfony2.x,這將是很容易的,只是在services.yml聲明,這行代碼:

$form = $this->createForm($this->get("applicant.form"), $applicant); 

但是,這已不再可能在Symfony的3,因爲這第一個參數期望字符串,而不是表單本身。

所以我的問題是:我如何在Symfony 3中創建表單作爲服務,或者是否有任何其他方式如何將EntityManager傳遞給表單?

謝謝你的幫助!

+2

將您的服務標記爲表單,然後傳遞別名。 http://symfony.com/doc/current/cookbook/form/create_custom_field_type.html#creating-your-field-type-as-a-service。應該像S2一樣工作。 – Cerad

+0

你試過這個:'$ form = $ this-> createForm(「applicant.form」,$申請者);'? – Matteo

回答

1

我試圖尋找到這個問題,我深入到這是這一個在github上的變化: https://github.com/symfony/symfony/commit/abca2d6fdc89479586e052cd11241d5a9bc885e5#diff-5c1348d69be32426ff20446c9e812365R64

然後我發現了PR到Symfony的具有這種BC去除,我決定問爲什麼原因,你可以在這裏看到它: https://github.com/symfony/symfony/pull/16075#issuecomment-165106123

我希望這可以幫助你周圍的概念!

+0

謝謝你解決它並在Github上指出這個問題。 – Xatoo

+0

我也很好奇!我在這裏幫忙! :) –

16

將表單類型定義爲服務並不意味着將從容器檢索到的實例傳遞到createForm。當這樣做時,只要涉及表單組件,容器就不會涉及。

要使用註冊爲服務的表單類型(使用form.type標記以便表單組件知道它),您只需按名稱(即Symfony 2.8+中的完全限定類名稱)和類型名稱在舊版本)在createFormFormBuilder::add。 這正是您爲Symfony核心類型btw(textchoice等)所做的,它們被註冊爲服務。 當使用表單類型作爲服務時,您的控制器的代碼根本不會改變,而不是具有不依賴並且在第一次使用時隱式註冊的表單類型。

+3

關於在賞金中傳遞@Xatoo請求的依賴關係的首選方式,這取決於依賴關係的種類。如果期望在表單類型的每次使用中發生更改(例如Symfony的「實體」類型中的QueryBuilder),則它屬於選項。如果它始終是相同的(「doctrine」服務訪問實體管理器),它屬於構造函數,以避免使用它的表單在傳遞選項時也依賴於服務 –

+0

偉大的,它爲我做了訣竅我也嘗試將表單服務傳遞給'createForm',它不起作用,'SearchForm:class'工作正常,實體管理器也通過表單服務傳遞,這就是魔術.. :) –

+0

嗨,親愛的stof。你能否更新你的答案,包括一個Symfony 3.3的例子(類型提示服務類,內部控制器)? – Trix

4

這是我從Symfony 2代碼注入一個表單作爲Symfony 3中的一個服務。

在我service.yml我改變

issue.form: 
    class: Gutersohn\Bundle\CoreBundle\Form\IssueType 
    arguments: ['@service_container'] 
    tags: 
     - { name: form.type, alias: issue } 

issue.form: 
    class: Gutersohn\Bundle\CoreBundle\Form\IssueType 
    arguments: ['@service_container'] 
    tags: 
     - { name: form.type } 

在我的控制,我改變

$form = $this->container->get('form.factory')->create($this->container->get('issue.form'), $issue, [ 
     "method" => "post", 
     "action" => $this->container->get('router')->generate("ticket_add") 
]); 

$form = $this->container->get('form.factory')->create(IssueType::class, $issue, [ 
     "method" => "post", 
     "action" => $this->container->get('router')->generate("ticket_add") 
]); 
+0

請注意,如果services.xml中的類路徑中存在à拼寫錯誤,則不會出現錯誤。我花了3天時間搞清楚了 – Chopchop

3

issue #17013 on GitHubaliemre說:

添加form.type標籤是足夠您的服務定義。

app.form.corporation_type: 
    class: App\CorporationBundle\Form\CorporationType 
    arguments: ["@doctrine.orm.entity_manager"] 
    tags: 
     - { name: form.type } 

控制器應保持不變:

$form = $this->createForm(CorporationType::class, $corporation); 

我測試和它的作品!