【问题标题】:Accessing Entity Passed to Form Builder with Symfony使用 Symfony 访问传递给表单生成器的实体
【发布时间】:2019-11-19 07:25:00
【问题描述】:

我正在使用 Symfony 框架构建一个表单,并试图了解如何将实体的实例传递给表单构建器。

控制器:

$organization = $user->getOrganization();
$form = $this->createForm(OrganizationCourseType::class, $organization);

OrganizationCourseType 类:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('courses', EntityType::class, [
            'class' => Course::class,
            'choice_label' => 'name',
            'multiple' => true,
            'expanded' => true,
            'query_builder' => function (EntityRepository $er) {
                return $er->createQueryBuilder('course')
                    ->andWhere('course.organization = :organization')
                    ->setParameter('organization', $organization);
            },
        ]);
    }

但是我得到了错误:

Notice: Undefined variable: organization

如何在表单构建器中访问实体(组织)?我需要将其作为选项传递吗?如果是这样,在控制器的 createForm 调用中包含它有什么意义?

【问题讨论】:

    标签: php symfony4 symfony-forms


    【解决方案1】:

    解决您问题的第二部分:“将其包含在createForm 电话中的意义何在?”

    当您将对象作为第二个参数传递给createFormBuilder 时,您正在传递表单的初始数据。 Symfony 将尝试在对象中查找与表单字段名称匹配的属性(或 getter/setter),并将其值分配给该字段。然后,在提交时,它会相应地更新您的模型。

    您通常会传递与表单的data_class 相同类型的对象,因此在您的情况下将是OrganizationCourse。您可以执行以下操作:

    $organizationCourse = new OrganizationCourse();
    $organizationCourse->setOrganization($user->getOrganization());
    $form = $this->createForm(OrganizationCourseType::class, $organizationCourse);
    

    您可以选择多个Courses 并将它们分配给Organization。 但是,这看起来不像您的用例,因为 OrganizationCourse 看起来像一个关系而不是一个实体,所以请参阅 @ehimel's answer

    【讨论】:

      【解决方案2】:

      在您的控制器中,将您的实体实例作为第三个参数传递给您的$form 定义行:

      $form = $this->createForm(OrganizationCourseType::class, null, ['organization' => $organization]);
      

      然后像这样在 FormType 类中检索它:

      public function buildForm(FormBuilderInterface $builder, array $options)
      {
          $organization = $options['organization'];
      
          $builder->add('courses', EntityType::class, [
              'class' => Course::class,
              'choice_label' => 'name',
              'multiple' => true,
              'expanded' => true,
              'query_builder' => function (EntityRepository $er) {
                  return $er->createQueryBuilder('course')
                      ->andWhere('course.organization = :organization')
                      ->setParameter('organization', $organization);
              },
          ]);
      }
      
      public function configureOptions(OptionsResolver $resolver)
      {
          $resolver->setRequired(['organization']);
      }
      

      【讨论】:

      • 通过您的确切示例,我仍然遇到未定义的组织错误。但是,如果我将第 3 行更改为 $this->organization = $options['organization'];以及对 $this->organization 的 setParameter 引用。谢谢!
      • @user1392897:嗯,我无法解释那个。很高兴它可以工作,但我编写的代码也应该可以工作。
      • 发现问题...我必须像这样添加'use':'query_builder' => function (EntityRepository $er) use ($organization) {
      猜你喜欢
      • 2019-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多