如何使用"inherit_data"减少代码重复
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.4,现已不再维护。
读本页的更新版本用于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 / Acme / / Company.php HelloBundle /实体名称空间Acme\HelloBundle\实体;类公司{私人$的名字;私人$网站;私人$地址;私人$zipcode;私人$城市;私人$国家;}
12 3 4 5 6 7 8 9 10 11 12 13
/ / src / Acme / / Customer.php HelloBundle /实体名称空间Acme\HelloBundle\实体;类客户{私人$firstName;私人$姓;私人$地址;私人$zipcode;私人$城市;私人$国家;}
正如你所看到的,每个实体共享一些相同的字段:地址
,zipcode
,城市
,国家
.
首先为这些实体构建两个表单,CompanyType
而且CustomerType
:
12 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src / Acme / HelloBundle /形式/类型/ CompanyType.php名称空间Acme\HelloBundle\形式\类型;使用ob娱乐下载\组件\形式\AbstractType;使用ob娱乐下载\组件\形式\FormBuilderInterface;类CompanyType扩展AbstractType{公共函数buildForm(FormBuilderInterface$构建器数组,$选项){$构建器->add (“名字”,“文本”)->add (“网站”,“文本”);}}
12 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src / Acme / HelloBundle /形式/类型/ CustomerType.php名称空间Acme\HelloBundle\形式\类型;使用ob娱乐下载\组件\形式\FormBuilderInterface;使用ob娱乐下载\组件\形式\AbstractType;类CustomerType扩展AbstractType{公共函数buildForm(FormBuilderInterface$构建器数组,$选项){$构建器->add (“firstName”,“文本”)->add (“姓”,“文本”);}}
而不是包含重复的字段地址
,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 28 29 30
/ / src / Acme / HelloBundle /形式/类型/ LocationType.php名称空间Acme\HelloBundle\形式\类型;使用ob娱乐下载\组件\形式\AbstractType;使用ob娱乐下载\组件\形式\FormBuilderInterface;使用ob娱乐下载\组件\OptionsResolver\OptionsResolverInterface;类LocationType扩展AbstractType{公共函数buildForm(FormBuilderInterface$构建器数组,$选项){$构建器->add (“地址”,“文本区域”)->add (“zipcode”,“文本”)->add (“城市”,“文本”)->add (“国家”,“文本”);}公共函数setDefaultOptions(OptionsResolverInterface$解析器){$解析器->setDefaults (数组(“inherit_data”= >真正的));}公共函数getName(){返回“位置”;}}
位置表单有一个有趣的选项集,即inherit_data
.此选项允许表单从其父表单继承其数据。控件的属性。如果嵌入到公司表单中,位置表单的字段将访问公司
实例。类的属性,如果嵌入到客户表单中客户
实例。很容易,不是吗?
请注意
而不是设置inherit_data
选项里面LocationType
,您也可以(就像任何选项一样)在的第三个参数中传递它构建器- > add ()
.
最后,通过将location表单添加到您的两个原始表单中来实现此工作:
1 2 3 4 5 6 7 8 9
/ / src / Acme / HelloBundle /形式/类型/ CompanyType.php公共函数buildForm(FormBuilderInterface$构建器数组,$选项){/ /……$构建器->add (“foo”,新LocationType (),数组(“data_class”= >“Acme \ HelloBundle \ \公司实体”));}
1 2 3 4 5 6 7 8 9
/ / src / Acme / HelloBundle /形式/类型/ CustomerType.php公共函数buildForm(FormBuilderInterface$构建器数组,$选项){/ /……$构建器->add (“酒吧”,新LocationType (),数组(“data_class”= >“Acme \ HelloBundle \实体\客户”));}
就是这样!您已经将重复的字段定义提取到一个单独的位置表单,可以在任何需要的地方重用它。
谨慎
带有inherit_data
选项集不能具有* _SET_DATA
事件监听器。
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。