2017-03-29 27 views
2

我正在构建使用Symfony 3 Forms,并且需要检索依赖于当前用户的集合,并在下拉列表中呈现该表单。Symfony 3:将变量传递到表单

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

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

理想情况下,我想要传递一个我在Controller中策划的集合,传入User对象以在窗体中运行查询,或以其他方式访问窗体中的用户ID以运行查询上。

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

回答

5

你应该

通在用户对象试图运行表内的查询

  1. 定义所需参数useroptions resolver

    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选项,所以你不会忘记它。

  1. 将用户实例或用户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)部分这使您可以访问匿名函数中的此变量。

    +0

    这工作就像一个魅力。非常感谢! – Mrshll1001

    0

    下面介绍如何将自定义集合传递给表单。例如:

    例如:产品实体;

    内部控制

    $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() 
        )); 
    } 
    
    +0

    注意:我使用产品实体而不是用户所要求的用户 –