如何使用"inherit_data"减少代码重复

编辑本页

如何使用"inherit_data"减少代码重复

inherit_data当您在不同的实体中有一些重复的字段时,表单字段选项可能非常有用。例如,假设你有两个实体,a公司和一个客户

12 3 4 5 6 7 8 9 10 11 12 13
/ / src /实体/ Company.php名称空间应用程序实体公司私人的名字私人网站私人地址私人zipcode私人城市私人国家;}
12 3 4 5 6 7 8 9 10 11 12 13
/ / src /实体/ Customer.php名称空间应用程序实体客户私人firstName私人私人地址私人zipcode私人城市私人国家;}

正如你所看到的,每个实体共享一些相同的字段:地址zipcode城市国家

首先为这些实体构建两个表单,CompanyType而且CustomerType

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src /形式/类型/ CompanyType.php名称空间应用程序形式类型使用ob娱乐下载组件形式AbstractType使用ob娱乐下载组件形式扩展核心类型TextType使用ob娱乐下载组件形式FormBuilderInterfaceCompanyType扩展AbstractType公共函数buildForm(FormBuilderInterface构建器数组,选项无效构建器->add (“名字”, TextType::类)->add (“网站”, TextType::类);}}
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src /形式/类型/ CustomerType.php名称空间应用程序形式类型使用ob娱乐下载组件形式AbstractType使用ob娱乐下载组件形式扩展核心类型TextType使用ob娱乐下载组件形式FormBuilderInterfaceCustomerType扩展AbstractType公共函数buildForm(FormBuilderInterface构建器数组,选项无效构建器->add (“firstName”, TextType::类)->add (“姓”, TextType::类);}}

而不是包含重复的字段地址zipcode城市而且国家在这两种形式中,创建第三种形式称为LocationType:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/ / src /形式/类型/ LocationType.php名称空间应用程序形式类型使用ob娱乐下载组件形式AbstractType使用ob娱乐下载组件形式扩展核心类型TextareaType使用ob娱乐下载组件形式扩展核心类型TextType使用ob娱乐下载组件形式FormBuilderInterface使用ob娱乐下载组件OptionsResolverOptionsResolverLocationType扩展AbstractType公共函数buildForm(FormBuilderInterface构建器数组,选项无效构建器->add (“地址”, TextareaType::类)->add (“zipcode”, TextType::类)->add (“城市”, TextType::类)->add (“国家”, TextType::类);}公共函数configureOptions(OptionsResolver解析器无效解析器->setDefaults ([“inherit_data”= >真正的]);}}

位置表单有一个有趣的选项集,即inherit_data.此选项允许表单从其父表单继承其数据。控件的属性。如果嵌入到公司表单中,位置表单的字段将访问公司实例。类的属性,如果嵌入到客户表单中客户实例。方便的,是吗?

请注意

而不是设置inherit_data选项里面LocationType,您也可以(就像任何选项一样)在的第三个参数中传递它构建器- > add ()

最后,通过将location表单添加到您的两个原始表单中来实现此工作:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/ / src /形式/类型/ CompanyType.php名称空间应用程序形式类型使用应用程序实体公司使用ob娱乐下载组件形式AbstractType/ /……CompanyType扩展AbstractType公共函数buildForm(FormBuilderInterface构建器数组,选项无效/ /……构建器->add (“foo”, LocationType::类,“data_class”= >公司::类,]);}}
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /形式/类型/ CustomerType.php名称空间应用程序形式类型使用应用程序实体客户使用ob娱乐下载组件形式AbstractTypeCustomerType扩展AbstractType公共函数buildForm(FormBuilderInterface构建器数组,选项无效/ /……构建器->add (“酒吧”, LocationType::类,“data_class”= >客户::类,]);}}

就是这样!您已经将重复的字段定义提取到一个单独的位置表单,可以在任何需要的地方重用它。

谨慎

带有inherit_data选项集不能具有* _SET_DATA事件监听器。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。
ob娱乐下载Symfony 6.2支持通过苏禄人
ob娱乐下载Symfony 6.2支持通过Les-Tilleuls.coop