2012-02-08 66 views
2

我有一個動態的選擇列表顯示在窗體中,我只想將它們保存在一個地方,因爲這些不是我必須關心的唯一數據集。Symfony2&Annotations&Choices驗證:如何存儲和檢索選項選項?

要驗證實體中的選擇 - CallbackValidator我需要指定一個修復類和函數,其中將選擇將返回。

這似乎不正確,因爲我仍然在學習Symfony2和DIC概念,然後我不希望指定具體的回調函數/類,而是服務或想辦法解決這個問題。

我想給不是一個類名,而是一個服務名稱作爲回調。我錯了嗎?

我需要的選項

  • 列表填寫表格
  • 驗證與註解實體
  • 知道現在在哪裏發送電子郵件(後下)

設置:

services.yml - 使用service_container和Form作爲服務定義的DataManager(我不'知道如果這是正確的):

services: 
    data_manager: 
    class: TestBundle\Service\DataManager 
    arguments: 
      - "@service_container" 
      - %tc_data.list% 
    support_type_form: 
    class: TestBundle\Form\Type\TicketType 
    arguments: ["@service_container"] 
    tags: 
     - { name: form.type } 

的形式爲:

class TicketType extends FormType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $theChoices = $this->getContainer()->get('data_manager')->getTheChoices(); 
     ... 
    } 
} 

實體:

class Ticket 
{ 
    /** 
    * @Assert\NotBlank() 
    * @Assert\Choice(callback = {"NotAServiceReference", "getTheChoices"}) 
    */ 
    private $the_list_field; 
} 

所以我的數據在服務列表中,但你會如何建議我檢索選擇來驗證實體?

另一種解決方案我認爲是使用回調驗證(鏈接2),但即使在文檔那裏最高審計機關:

// somehow you have an array of "fake names" 
$fakeNames = array(); 

怎麼/你解決這個問題?

參考文獻:

  1. 見:http://symfony.com/doc/current/reference/constraints/Choice.html#supplying-the-choices-with-a-callback-function(點擊註釋)
  2. 參見:http://symfony.com/doc/current/reference/constraints/Callback.html#the-callback-method

回答

1
  1. 避免將service_container您服務。依賴注入背後的基本思想是隻注入那些實際需要的對象。
  2. 因此對於您的DataManager,您可能只需要注入實體管理器。
  3. 對於您的TicketType,請注入您的DataManager服務。在這一點上,你可以用一種很好的通用方式來完成$ this-> dataManager-> getChoices()。

就實體內部的驗證而言,並不確定是否需要。form-> isValid()已經檢查過,以確保你的選擇是有效的。但我可以理解Assert \ Choices應該能夠指定服務的期望。

從這裏:http://symfony.com/doc/current/reference/constraints/Callback.html

這是目前不可能,但是,到指定服務作爲約束。要使用服務進行驗證,您應該創建一個自定義驗證約束並將該新約束添加到您的類中。

+0

謝謝。這真的有幫助。爲1.我避免按照你的建議傳遞service_container。問題的關鍵在於,如果我不必每次都爲每次測試設置整個容器,那麼測試更容易。到2.DataManager現在只注入來自parameters.yml的數據列表。到3.完全按照你的說法,現在看起來很乾淨。我記住,當我發送這個信息時,我可以編寫自己的驗證和約束,並確認了我的想法。謝謝! – dazz 2012-02-09 16:35:23