2013-05-09 17 views
1

我需要傳遞一個參數給一個正在使用的表單類型的實體的構造函數。如何從表單類型設置實體構造函數參數?

我設置從setDefaultOptions方法的表單類型的實體:

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'MyApp\MyBundle\Entity\MyEntity' 
    )); 
} 

我想用這樣的:

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'MyApp\MyBundle\Entity\MyEntity', 
     'my_parameter' => 'some value' 
    )); 
} 

,這樣它會通過注入構造函數。

這可能嗎? (我正在使用Symfony 2.2)

+0

爲什麼您需要一個值?爲「提取」一組(或一個單一的,準確的)實體? – DonCallisto 2013-05-09 10:25:15

+0

我只是想傳遞一個參數給實體。 – 2013-05-09 10:59:33

回答

2

表單類型永遠不會創建任何實體對象。因此,爲實體構造函數傳遞參數似乎沒有任何意義。

設置data_class選項甚至不需要將表單與實體對象結合。在大多數情況下,基於傳遞給表單構建器的對象猜測數據類。

從Symfony的文檔:

每個表單需要知道保持 底層數據(例如Acme公司\ TaskBundle \實體\任務)的類的名字。通常,根據傳遞給 createForm(即$任務)的第二個參數的對象猜測,這是 。後來,當你開始嵌入表單時,這個 將不再是足夠的。所以,雖然並不總是必要的,這是 通常一個好主意,明確指定data_class選項 (...)

編輯

一個例子:

class SomeController extends Controller 
{ 
    public function fooAction() 
    { 
     $entityObject = new MyEntity($someArgument); 

     // now we create form: 
     $form = $this->createForm(new BarFormType(), $entityObject); 

     // then you can bind form: 
     $form->bind($this->getRequest()); 

     // ... and enjoy your data :) 
     printf("Hello %s", $entityObject->getValuePassedByUserViaForm()); 
    } 
} 
+0

因此,在顯示錶單的頁面的情況下,如何將參數傳遞給實體? – 2013-05-09 11:18:37

+0

+1「注意」部分 – DonCallisto 2013-05-09 12:24:48

+0

林不知道我是否理解你。讓我試着澄清一下:通過將實體對象作爲第二個參數傳遞給createForm方法(表單工廠),將實體對象與表單連接起來。這意味着你需要在之前創建一個實體對象。接下來,當您提交表單並綁定請求時 - 實體對象將填充通過表單傳遞的數據。我已經用示例 – Cyprian 2013-05-09 21:22:11

9

我認爲你在尋找這http://symfony.com/doc/master/cookbook/form/use_empty_data.html#option-2-provide-a-closure

假設你有數據貨幣對象,它需要兩個參數數量和貨幣。以下是此類對象的表單類型:

<?php 
class MoneyType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('amount', 'number') 
      ->add('currency', 'text') 
     ; 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Foo\Model\Money', 
      'empty_data' => function (FormInterface $form) { 
       return new Money(
        $form->getData()['amount'], 
        $form->getData()['currency'] 
       ); 
      }, 
     )); 
    } 
} 
+2

同意,但如果沒有任何「setCurrency」,則拋出異常。你解決了這個案子嗎? – mmoreram 2014-07-14 18:04:07

+0

你只有一種貨幣?不想在表單上顯示它?如果是這樣的 我相信有可能將選項傳遞給empty_data閉包作爲第二個參數。所以你可以刪除一個表單域貨幣並從選項中獲取。 – 2014-07-15 09:46:01

+1

對我來說,它是'$ form-> get('amount') - > getData()'等工作 – Jimbo 2015-02-17 14:38:44

相關問題