何时以及如何使用数据映射器
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 4.1,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
何时以及如何使用数据映射器
一种复合时,初始数据需要传递给每个孩子可以显示自己的输入值。提交,孩子们的价值观需要写回的形式。
数据映射器负责读写数据,进入父母形式。
主要的内置数据映射器使用PropertyAccess组件并将适合大多数情况下。但是,您可以创建您自己的实现,例如,通过提交数据,通过它们的构造函数不可变对象。
数据变压器和映射器的区别
知道之间的区别是很重要的数据变形金刚和映射器。
- 数据变形金刚改变一个值的表示形式(例如
“2016-08-12”
到一个DateTime
实例); - 数据映射器地图数据(例如,一个对象或数组)表单字段,反之亦然。
改变一个YYYY-mm-dd
字符串值,DateTime
实例是通过数据变压器。内部填充字段(e。g,小时等)复合日期类型使用DateTime
实例是通过数据映射器。
创建一个数据映射器
假设您想要保存到数据库的一组颜色。为此,你使用一个不可变的颜色对象:
1 2 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 31
/ / src / App /绘画/ Color.php名称空间应用程序\绘画;最后类颜色{私人美元红色的;私人美元绿色;私人美元蓝色的;公共函数__construct(int美元红色的,int美元绿色,int美元蓝色的){美元这- >红色=美元红色的;美元这- >绿色=美元绿色;美元这- >蓝色=美元蓝色的;}公共函数getRed():int{返回美元这- >红色;}公共函数getGreen():int{返回美元这- >绿色的;}公共函数getBlue():int{返回美元这- >蓝色;}}
表单类型应该允许编辑一个颜色。而是因为你决定颜色
不可变对象,必须创建一个新的颜色对象每次的价值观之一是改变。
提示
如果你使用一个可变对象构造函数参数,而不是使用一个数据映射器,你应该配置empty_data
选择一个闭包中描述如何配置空数据形式类。
红色,绿色和蓝色的表单字段必须映射到构造函数参数和颜色
实例必须映射到红色、绿色和蓝色的表单字段。认识一个熟悉的模式吗?这是时间数据映射器!
1 2 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
/ / src / App /形式/ DataMapper / ColorMapper.php名称空间应用程序\形式\DataMapper;使用应用程序\绘画\颜色;使用ob娱乐下载\组件\形式\DataMapperInterface;使用ob娱乐下载\组件\形式\异常\UnexpectedTypeException;使用ob娱乐下载\组件\形式\FormInterface;最后类ColorMapper实现了DataMapperInterface{/ * * *@param色|零美元数据* /公共函数mapDataToForms(美元数据,美元形式){/ /没有数据,所以没有预填充如果(零= = =美元数据){返回;}/ /无效的数据类型如果(!美元数据运算符颜色){扔新UnexpectedTypeException (美元数据,颜色::类);}/ * *@varFormInterface[]美元形式* /美元形式= iterator_to_array (美元形式);/ /初始化表单字段值美元形式(“红色”]- >setData (美元数据- >getRed ());美元形式(“绿色”]- >setData (美元数据- >getGreen ());美元形式(“蓝”]- >setData (美元数据- >getBlue ());}公共函数mapFormsToData(美元形式,&美元数据){/ * *@varFormInterface[]美元形式* /美元形式= iterator_to_array (美元形式);/ /以引用的方式传递数据,覆盖将改变它/ /表单对象/ /当心类型不一致,请参阅下面的警告美元数据=新颜色(美元形式(“红色”]- >getData (),美元形式(“绿色”]- >getData (),美元形式(“蓝”]- >getData ());}}
谨慎
数据传递到映射器还没有验证。这意味着您的对象应该允许被创建在一个无效的状态,以产生友好的错误形式。
使用映射器
你准备使用的数据映射器ColorType
的形式。使用setdatamap ()方法配置数据映射器:
1 2 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 31 32 33 34 35
/ / src / App / /类型/ ColorType.php形式名称空间应用程序\形式\类型;使用应用程序\形式\DataMapper\ColorMapper;使用ob娱乐下载\组件\形式\AbstractType;使用ob娱乐下载\组件\形式\扩展\核心\类型\IntegerType;使用ob娱乐下载\组件\形式\FormBuilderInterface;使用ob娱乐下载\组件\OptionsResolver\OptionsResolver;最后类ColorType扩展AbstractType{公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项){美元构建器- >add (“红色”,IntegerType::类,/ /执行严格的类型,以确保构造函数/ /颜色类的不休息“empty_data”= >' 0 ',)- >add (“绿色”,IntegerType::类,“empty_data”= >' 0 ',)- >add (“蓝”,IntegerType::类,“empty_data”= >' 0 ',)- >setdatamap (新ColorMapper ());}公共函数configureOptions(OptionsResolver美元解析器){/ /创建一个新的颜色时,初始数据应该是零美元解析器- >setDefault (“empty_data”,零);}}
太酷了!当使用ColorType
形式,自定义ColorMapper
将会创建一个新颜色
现在的对象。
谨慎
当有一种形式inherit_data
选项设置为真正的
,它不使用数据映射器,让它的父地图内部值。
提示
你也可以实现DataMapperInterface
在ColorType
并添加mapDataToForms ()
和mapFormsToData ()
直接输入形式,以避免创建一个新类。你会需要调用构建器- > setdatamap美元(美元)
。