如何使用"inherit_data"减少代码重复
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.8,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
如何使用"inherit_data"减少代码重复
2.3
这inherit_data
选项在Symfony 2.3中引入。ob娱乐下载以前,它被称为虚拟
.
的inherit_data
当您在不同的实体中有一些重复的字段时,表单字段选项可能非常有用。例如,假设你有两个实体,a公司
和一个客户
:
12 3 4 5 6 7 8 9 10 11 12 13
/ / src / AppBundle /实体/ Company.php名称空间AppBundle\实体;类公司{私人$的名字;私人$网站;私人$地址;私人$zipcode;私人$城市;私人$国家;}
12 3 4 5 6 7 8 9 10 11 12 13
/ / src / AppBundle /实体/ Customer.php名称空间AppBundle\实体;类客户{私人$firstName;私人$姓;私人$地址;私人$zipcode;私人$城市;私人$国家;}
正如你所看到的,每个实体共享一些相同的字段:地址
,zipcode
,城市
,国家
.
首先为这些实体构建两个表单,CompanyType
而且CustomerType
:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src / AppBundle / /类型/ CompanyType.php形式名称空间AppBundle\形式\类型;使用ob娱乐下载\组件\形式\AbstractType;使用ob娱乐下载\组件\形式\FormBuilderInterface;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;类CompanyType扩展AbstractType{公共函数buildForm(FormBuilderInterface$构建器数组,$选项){$构建器->add (“名字”, TextType::类)->add (“网站”, TextType::类);}}
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src / AppBundle / /类型/ CustomerType.php形式名称空间AppBundle\形式\类型;使用ob娱乐下载\组件\形式\FormBuilderInterface;使用ob娱乐下载\组件\形式\AbstractType;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;类CustomerType扩展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 / AppBundle / /类型/ LocationType.php形式名称空间AppBundle\形式\类型;使用ob娱乐下载\组件\形式\AbstractType;使用ob娱乐下载\组件\形式\FormBuilderInterface;使用ob娱乐下载\组件\OptionsResolver\OptionsResolver;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextareaType;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;类LocationType扩展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
/ / src / AppBundle / /类型/ CompanyType.php形式使用AppBundle\实体\公司;/ /……公共函数buildForm(FormBuilderInterface$构建器数组,$选项){/ /……$构建器->add (“foo”, LocationType::类,数组(“data_class”= >公司::类);}
12 3 4 5 6 7 8 9 10 11 12
/ / src / AppBundle / /类型/ CustomerType.php形式使用AppBundle\实体\客户;/ /……公共函数buildForm(FormBuilderInterface$构建器数组,$选项){/ /……$构建器->add (“酒吧”, LocationType::类,数组(“data_class”= >客户::类);}
就是这样!您已经将重复的字段定义提取到一个单独的位置表单,可以在任何需要的地方重用它。
谨慎
带有inherit_data
选项集不能具有* _SET_DATA
事件监听器。
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。