Php 如何使用symfony 4为2个不同的实体创建表单类?

Php 如何使用symfony 4为2个不同的实体创建表单类?,php,forms,symfony4,Php,Forms,Symfony4,您好,我正在使用Symfony 4 我想创建一个formClass,它为两个不同的实体(如“供应商”和“地址”)插入数据。请解释我如何创建表单类以通过同一表单接受两个不同实体的数据 我已经创建了form类,它只接受一个实体的数据,但我没有创建formclass,它接受两个不同实体的数据 基本上,我不会将表单作为一个整体嵌入到一起。组合表单(首选) 假设您有两个实体Vendor和Address以及这些实体的表单VendorType和addressype,您可以创建一个表单类型vendoraddre

您好,我正在使用Symfony 4

我想创建一个formClass,它为两个不同的实体(如“供应商”和“地址”)插入数据。请解释我如何创建表单类以通过同一表单接受两个不同实体的数据

我已经创建了form类,它只接受一个实体的数据,但我没有创建formclass,它接受两个不同实体的数据

基本上,我不会将表单作为一个整体嵌入到一起。

组合表单(首选) 假设您有两个实体
Vendor
Address
以及这些实体的表单
VendorType
addressype
,您可以创建一个表单类型
vendoraddressype
,作为
buildForm
函数使用

$builder->add('vendor', VendorType::class)
        ->add('address', AddressType::class);
在创建
VendorAddressType
表单时,您提供一个数组
['vendor'=>$vendor',address'=>$address]
。(类似地,您可以将选项传递给子窗体)。每个子表单的
data\u class
选项可以是适当的类,组合表单的
data\u class
选项必须是
null

现在,在正常的symfony表单模板中,这些表单的呈现方式与真正的表单不同,但是这些模板可以扩展,这样您就可以在
form.vendor
form.address
上调用
form\u widget
(请参阅)

按字面意思合并表格(非首选) 与之前相同的假设是,您可以将每种表单类型的内容复制到新的VendorAddress表单中,然后为所有字段设置
property\u path
属性以指向相应的实体,如:

$builder->add('vendorfieldA', SomeType::class, ['property_path' => 'vendor.fieldA'])
它将在键
vendor
处查看提供的数据数组(参见前面),并选择其属性
fieldA


我建议不要采用这种方法,因为对单一实体表格的任何更改都必须针对多个实体表格重复进行。相反,我建议创建静态buildForm函数(添加一个参数
prefix
或其他东西),可以通过
VendorType::staticBuildForm($builder,$prefix)
$prefix='vendor.
)从组合表单类型调用该函数。(您必须将该前缀转换为可以附加/前置到表单字段名称的内容,或者显式提供该前缀)

首先,不要使用实体类型,创建自己的DTO(数据传输对象)。我假设这两个实体共享一些字段。因此,您可以创建一个facade,它将帮助您将DTO转换为实体类型

使您的DTO基于请求而不是实际实体,这有一个很大的优势,因为您的代码耦合性较低,并且对于将来的更改更灵活,尽管这需要一些额外的工作。例如,您需要自己填充DTO,并根据某种策略将其转换回实体,在您的情况下,它将是供应商和访问


有一篇很好的文章详细地解释了如何做,你可以看看它

这些实体是重叠的还是应该并排输入/显示在表单中?@Jakumi:它们应该作为同一表单的条目显示。