Symfony 3:将变量传递给表单
Symfony 3: Passing variables into forms
我正在使用 Symfony 3 Forms 进行构建,并且需要在表单中检索依赖于当前用户的集合以在下拉列表中呈现。
使用 EntityType
我可以检索所有实体的列表,但我希望能够 运行 自定义查询,该查询仅检索与当前用户对象有关系的实体。
我已阅读有关表单和 EntityType 的文档,其中解释了自定义查询并提到将集合作为参数传递。但是我在任何地方都找不到关于如何实现这一点的说明。
理想情况下,我想传入我在 Controller 中策划的集合,将 User 对象传入 运行 表单内的查询,或者以其他方式访问用户 ID形成 运行 上的查询。
有没有人找到类似的解决方案?
你应该试试
pass in the User object to run the query inside the Form
在options resolver中定义需要的参数user
:
public function configureOptions(OptionsResolver $resolver)
{
// ...
$resolver->setRequired('user');
// type validation - User instance or int, you can also pick just one.
$resolver->setAllowedTypes('user', array(User::class, 'int'));
}
它会强制您通过 user
选项,这样您就不会忘记它。
- 将用户实例或用户 ID 作为选项传递到表单中。
在控制器中它可能看起来像这样:
$this->createForm(SomeFormType::class, $underlyingObjectOrNull, array(
'user' => $this->getUser(),
));
建立一个custom query for EntityType
字段:
$user = $options['user'];
$builder->add('someField', EntityType::class, array(
'class' => 'AppBundle:SomeEntity',
'query_builder' => function (EntityRepository $er) use($user) {
return $er->createQueryBuilder('u')
//.. -> some method building the query builder
},
));
请注意 use($user)
部分,它允许您在匿名函数中访问此变量。
以下是将自定义集合传递到表单的方法。
例如:产品实体;
控制器内部
$form = $this->createForm(ProductType::class, $product, array('recommended_product' => $recommendedProduct));
FormType 内部
$builder
->add('recommended_product', EntityType::class, array(
'class' => 'AppBundle\Entity\Product',
'choices' => $options['recommended_product'],
'choice_label' => function (Product $user) {
return $user->getProduct();
}
));
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Product',
'recommended_product' => array()
));
}
我正在使用 Symfony 3 Forms 进行构建,并且需要在表单中检索依赖于当前用户的集合以在下拉列表中呈现。
使用 EntityType
我可以检索所有实体的列表,但我希望能够 运行 自定义查询,该查询仅检索与当前用户对象有关系的实体。
我已阅读有关表单和 EntityType 的文档,其中解释了自定义查询并提到将集合作为参数传递。但是我在任何地方都找不到关于如何实现这一点的说明。
理想情况下,我想传入我在 Controller 中策划的集合,将 User 对象传入 运行 表单内的查询,或者以其他方式访问用户 ID形成 运行 上的查询。
有没有人找到类似的解决方案?
你应该试试
pass in the User object to run the query inside the Form
在options resolver中定义需要的参数
user
:public function configureOptions(OptionsResolver $resolver) { // ... $resolver->setRequired('user'); // type validation - User instance or int, you can also pick just one. $resolver->setAllowedTypes('user', array(User::class, 'int')); }
它会强制您通过 user
选项,这样您就不会忘记它。
- 将用户实例或用户 ID 作为选项传递到表单中。
在控制器中它可能看起来像这样:
$this->createForm(SomeFormType::class, $underlyingObjectOrNull, array(
'user' => $this->getUser(),
));
建立一个custom query for
EntityType
字段:$user = $options['user']; $builder->add('someField', EntityType::class, array( 'class' => 'AppBundle:SomeEntity', 'query_builder' => function (EntityRepository $er) use($user) { return $er->createQueryBuilder('u') //.. -> some method building the query builder }, ));
请注意 use($user)
部分,它允许您在匿名函数中访问此变量。
以下是将自定义集合传递到表单的方法。
例如:产品实体;
控制器内部
$form = $this->createForm(ProductType::class, $product, array('recommended_product' => $recommendedProduct));
FormType 内部
$builder
->add('recommended_product', EntityType::class, array(
'class' => 'AppBundle\Entity\Product',
'choices' => $options['recommended_product'],
'choice_label' => function (Product $user) {
return $user->getProduct();
}
));
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Product',
'recommended_product' => array()
));
}