2013-10-31 70 views
2

我必須將自定義選項傳遞給symfony表單。我一步一步跟蹤了文檔setp,但我的選項不會通過。如何將自定義選項傳遞給Symfony表單

的FormType

class AdvertType extends AbstractType 
{ 
    /** 
    * {@inheritDoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $entityManager = $options['em']; 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    {  
     $resolver->setRequired(array(
      'em', 
     )); 

     $resolver->setAllowedTypes(array(
      'em' => 'Doctrine\Common\Persistence\ObjectManager', 
     )); 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    public function getName() 
    { 
     return 'advert'; 
    } 
} 

這裏是來自控制器的代碼。

$form = $this->createForm(new AdvertType(), new Advert(), array(
    'em' => $this->getDoctrine()->getManager(), 
)); 

Symfony會拋出我的選項em丟失的例外。

例外:需要的選項 「EM」 丟失。

我跟着教程添加數據變壓器:http://symfony.com/doc/current/cookbook/form/data_transformers.html

我清除了緩存和重新啓動我的Web服務器,但沒有將工作。我錯了什麼?我錯過了一個配置來通過我的$options?看起來來自我通過的控制器的$options陣列永遠不會達到buildForm方法。

我使用Symfony的V2.3.5。爲了測試我更新到最新(2.3.6),但問題依然存在。

乾杯。

回答

1

我用我的表單兩次(以不同的方式),所以錯誤的結果來自錯誤的用法。我看錯了地方。一般的代碼是正確的。對不起。

+0

呃,我討厭它發生這種情況!哈哈。 – Tek

3

我複製你的代碼,並用它成功地(Symfony的2.3.6)。有效!您不應該清除緩存。所以我不確定有什麼問題。如果要將表單限制爲您的廣告對象,則還應考慮在解析器中添加data_class選項,例如,

$resolver 
     ->setDefaults(array(
      'data_class' => 'Your\Bundle\Entity\Advert', 
     )) 
    ; 
相關問題