使用Symfony访问传递给Form Builder的实体

时间:2019-07-09 17:15:02

标签: php symfony4 symfony-forms

我正在使用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调用中有什么意义?

2 个答案:

答案 0 :(得分:2)

要解决问题的第二部分:“将其包含在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

答案 1 :(得分:1)

在您的控制器中,将您的实体实例作为第三个参数传递到您的$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']);
}