Symfony 3:将变量传递给表单

Mrs*_*001 3 php forms entities symfony

我正在使用Symfony 3 Forms构建,并且需要在表单中检索依赖于当前用户的集合,以在下拉列表中呈现.

使用EntityType我可以检索所有实体的列表,但我希望能够运行自定义查询,该查询仅检索与当前用户对象有关系的查询.

我已经阅读了有关表单和EntityType的文档,它解释了自定义查询和提及作为参数传递集合.但我无法找到有关如何在任何地方实现这一目标的说明.

理想情况下,我想要传入我在Controller中策划的集合,传入User对象以在Form中运行查询,或以其他方式访问表单中的用户ID以运行查询.

有没有人找到类似的解决方案?

Jak*_*zak 6

你应该试试

传入User对象以在Form中运行查询

  1. 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'));
    }
    
    Run Code Online (Sandbox Code Playgroud)

它会强制你通过user选项,所以你不会忘记它.

  1. 将用户实例或用户ID作为选项传递到表单中.

在控制器中它可能看起来像这样:

$this->createForm(SomeFormType::class, $underlyingObjectOrNull, array(
    'user' => $this->getUser(),
));
Run Code Online (Sandbox Code Playgroud)
  1. 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
        },
    ));
    
    Run Code Online (Sandbox Code Playgroud)

请注意use($user)部分,它允许您在匿名函数内访问此变量.


Gab*_*ann 5

以下是如何将自定义集合传递到表单中。

例如:产品实体;

内部控制器

$form = $this->createForm(ProductType::class, $product, array('recommended_product' => $recommendedProduct));
Run Code Online (Sandbox Code Playgroud)

内部表单类型

 $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()
    ));
}
Run Code Online (Sandbox Code Playgroud)