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

zer*_*kms 8 php doctrine symfony doctrine-orm

假设我有普通*Type班级:

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

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

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

UPD:

我知道entity类型,但不幸的是我不能使用它,因为我的属性不是也不能被定义为one-to-one关系,因为Doctrine不支持的非常复杂的关系条件(但是?).有关其他详细信息,请参阅如何在Doctrine 2中1:1关系指定多个连接条件

Dar*_*ght 12

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

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

编辑:实际上'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
));
Run Code Online (Sandbox Code Playgroud)

$options阵列被传递到FooType::buildForm()方法,从而foo_repository然后应在像因此这种方法可用:

$er = $options['foo_repository'];
Run Code Online (Sandbox Code Playgroud)

  • 第三个参数是一个表单的数组选项,我们不能向这个实例传递任何东西。我认为构造函数是一个更好的解决方案。:( (2认同)
  • 我应该注意,现在不推荐使用`getEntityManager()`来支持`getManager()`最新版本的Symfony2. (2认同)