2012-02-06 103 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