2012-02-06 98 views
6

比方說,我有普通*Type類:如何在Symfony 2的Form(Type)類中獲取實體庫的實例?

class LocationType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder 
      ->add(...) 
      ... 
    } 
} 

和領域之一是choice類型。需要用作選擇項的值應該從數據庫中檢索(來自某個特定的實體存儲庫)。

所以問題是:如何獲得LocationType類中的存儲庫?通過構造函數傳遞它是獲得它的唯一方法嗎?

UPD

我知道entity類型,但不幸的是我不能使用它,因爲我的財產是不是也不能被定義爲one-to-one關係,由於該學說不支持非常複雜關係的條件(但?)。見How to specify several join conditions for 1:1 relationship in Doctrine 2瞭解更多詳細信息

回答

9

可以作爲一個選項來指定一個實體字段類型,像這樣:

$builder 
    ->add('foo', 'entity', array(
     'class' => 'FooBarBundle:Foo', 
     'query_builder' => function(\Doctrine\ORM\EntityRepository $er) { 
      return $er->createQueryBuilder('q')->orderBy('q.name', 'ASC'); 
     }, 
    )); 

編輯: 其實「類」選項是唯一必填字段的選項。您可以在這裏閱讀更多有關實體字段類型的信息:http://symfony.com/doc/2.0/reference/forms/types/entity.html

希望這會有所幫助。

EDIT

繼下面的討論,在這裏是一個例子

在控制器:

$entity = new Foo(); 
$type = new FooType(); 

$er = $this->getDoctrine() 
    ->getEntityManager() 
    ->getRepository('FooBarBundle:Foo'); 

$form = $this->createForm($type, $entity, array(
    'foo_repository' => $er 
)); 

$options數組傳遞到FooType::buildForm()方法,所以foo_repository應該然後是可用這種方法如下:

$er = $options['foo_repository']; 
+0

我不能這樣做,因爲我的'foo'屬性沒有被定義爲任何關係('一對一或任何其他),因爲關係是以非常困難的方式定義的,原則目前不支持。 http://stackoverflow.com/questions/9123264/how-to-specify-several-join-conditions-for-11-relationship-in-doctrine-2 - 這裏是解釋案例的問題 – zerkms 2012-02-06 21:23:22

+0

對不起,我沒有'在第一個問題修訂版中指定了這些重要細節,無論如何都是+1。任何其他想法? – zerkms 2012-02-06 21:27:48

+0

嗨。沒問題。無論如何,我可能會太快地閱讀你的問題!我建議在你的控制器中將'$ this-> buildForm($ type,$ entity,array('repository'=> $ er))'作爲一個選項傳遞給你的窗體,但是我想給你的問題你正在尋求避免這一點。 – 2012-02-06 21:42:39