gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 12:49:18 24 4
gpt4 key购买 nike

假设我有普通的 *Type 类:

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

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

那么问题来了:如何获取LocationType类中的repository?通过构造函数传递它是获取它的唯一方法吗?

更新:

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

最佳答案

您可以像这样将实体字段类型指定为选项:

$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

希望这对您有所帮助。

编辑:

为了进一步讨论下面的内容,这里有一个例子

在 Controller 中:

$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'];

Symfony 4 和 5:

Symfony 表单类型是服务,因此您可以使用依赖注入(inject):

class FooType extends AbstractType
{
private $entityManager;

public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}

private function getFooRepository(): FooRepository
{
return $this->entityManager->getRepository(Foo::class);
}

...
}

或注入(inject)特定的存储库:

class FooType extends AbstractType
{
private $fooRepository;

public function __construct(FooRepository $fooRepository)
{
$this->fooRepository = $fooRepository;
}

...
}

关于php - 如何在 Symfony 2 的 Form (Type) 类中获取实体存储库的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9167213/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com