【问题标题】:Symfony 3: Passing variables into formsSymfony 3:将变量传递到表单中
【发布时间】:2017-03-29 11:29:12
【问题描述】:

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

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

我已阅读有关表单和 EntityType 的文档,其中解释了自定义查询并提到将集合作为参数传递。但我在任何地方都找不到有关如何实现这一点的说明。

理想情况下,我想传入我在控制器中策划的集合,传入用户对象以在表单内运行查询,或者访问表单中的用户 ID 以运行查询.

有没有人找到解决类似问题的方法?

【问题讨论】:

    标签: php forms symfony entities


    【解决方案1】:

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

    例如:产品实体;

    内部控制器

    $form = $this->createForm(ProductType::class, $product, array('recommended_product' => $recommendedProduct));
    

    在表单类型中

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

    【讨论】:

    • 注意:我使用产品实体而不是用户要求的用户
    【解决方案2】:

    你应该试试

    传入用户对象以在表单内运行查询

    1. 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 选项,这样你就不会忘记它。

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

    在控制器中可能如下所示:

    $this->createForm(SomeFormType::class, $underlyingObjectOrNull, array(
        'user' => $this->getUser(),
    ));
    
    1. 构建一个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) 部分,它允许您在匿名函数中访问此变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 2011-07-14
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      相关资源
      最近更新 更多