我正在使用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调用中有什么意义?
答案 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']);
}