如何在Symfony 2中的Form(Type)类中获取实体存储库的实例?

时间:2012-02-06 21:02:10

标签: php symfony doctrine doctrine-orm

假设我有普通的*Type课程:

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

其中一个字段是choice类型。应该从数据库(从某个特定的实体存储库)中检索需要用作选择项的值。

所以问题是:如何在LocationType类中获取存储库?是通过构造函数传递它的唯一方法吗?

UPD

我知道entity类型,但不幸的是我不能使用它,因为我的属性不是也不能被定义为one-to-one关系,因为Doctrine不支持非常复杂的关系条件(但是? )。有关其他详细信息,请参阅How to specify several join conditions for 1:1 relationship in Doctrine 2

1 个答案:

答案 0 :(得分:12)

您可以将实体字段类型指定为选项,如下所示:

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

修改: 实际上'class'选项是唯一必需的字段选项。您可以在此处阅读有关实体字段类型的更多信息:http://symfony.com/doc/2.0/reference/forms/types/entity.html

希望这有帮助。

修改

下面进一步讨论,这是一个例子

在控制器中:

$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()方法,因此{I}}应该在此方法中可用,如下所示:

foo_repository