何时以及如何使用数据映射器

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 4.2,不再维护。

这个页面的更新版本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 /绘画/ Color.php名称空间应用程序\绘画;最后颜色{私人美元红色的;私人美元绿色;私人美元蓝色的;公共函数__construct(int美元红色的,int美元绿色,int美元蓝色的){美元- >红色=美元红色的;美元- >绿色=美元绿色;美元- >蓝色=美元蓝色的;}公共函数getRed():int{返回美元- >红色;}公共函数getGreen():int{返回美元- >绿色的;}公共函数getBlue():int{返回美元- >蓝色;}}

表单类型应该允许编辑一个颜色。而是因为你决定颜色不可变对象,必须创建一个新的颜色对象每次的价值观之一是改变。

提示

如果你使用一个可变对象构造函数参数,而不是使用一个数据映射器,你应该配置empty_data选择一个闭包中描述如何配置空数据形式类

红色,绿色和蓝色的表单字段必须映射到构造函数参数和颜色实例必须映射到红色、绿色和蓝色的表单字段。认识一个熟悉的模式吗?是时候数据映射器。创建一个最简单的方法是通过实现DataMapperInterface在表单类型:

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 50 51 52
/ / src /形式/ ColorType.php名称空间应用程序\形式;使用应用程序\绘画\颜色;使用ob娱乐下载\组件\形式\AbstractType;使用ob娱乐下载\组件\形式\DataMapperInterface;使用ob娱乐下载\组件\形式\异常\UnexpectedTypeException;使用ob娱乐下载\组件\形式\FormInterface;最后ColorType扩展AbstractType实现了DataMapperInterface{/ /……/ * * *@param色|零视讯系统* /美元公共函数mapDataToForms(美元显示数据,美元形式){/ /没有数据,所以没有预填充如果(= = =美元显示数据){返回;}/ /无效的数据类型如果(!美元显示数据运算符颜色){UnexpectedTypeException (美元显示数据,颜色::类);}/ * *@varFormInterface[]美元形式* /美元形式= iterator_to_array (美元形式);/ /初始化表单字段值美元形式(“红色”]- >setData (美元显示数据- >getRed ());美元形式(“绿色”]- >setData (美元显示数据- >getGreen ());美元形式(“蓝”]- >setData (美元显示数据- >getBlue ());}公共函数mapFormsToData(美元形式,&美元显示数据){/ * *@varFormInterface[]美元形式* /美元形式= iterator_to_array (美元形式);/ /以引用的方式传递数据,覆盖将改变它/ /表单对象/ /当心类型不一致,请参阅下面的警告美元显示数据=颜色(美元形式(“红色”]- >getData (),美元形式(“绿色”]- >getData (),美元形式(“蓝”]- >getData ());}}

谨慎

数据传递到映射器还没有验证。这意味着您的对象应该允许被创建在一个无效的状态,以产生友好的错误形式。

使用映射器

创建数据映射器后,您需要配置形式使用它。这是通过使用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 36 37
/ / src /形式/类型/ ColorType.php名称空间应用程序\形式\类型;/ /……使用ob娱乐下载\组件\形式\扩展\核心\类型\IntegerType;使用ob娱乐下载\组件\形式\FormBuilderInterface;使用ob娱乐下载\组件\OptionsResolver\OptionsResolver;最后ColorType扩展AbstractType实现了DataMapperInterface{公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项){美元构建器- >add (“红色”,IntegerType::类,/ /执行严格的类型,以确保构造函数/ /颜色类的不休息“empty_data”= >' 0 ',)- >add (“绿色”,IntegerType::类,“empty_data”= >' 0 ',)- >add (“蓝”,IntegerType::类,“empty_data”= >' 0 ',)/ /这个FormType配置数据映射器- >setdatamap (美元);}公共函数configureOptions(OptionsResolver美元解析器){/ /创建一个新的颜色时,初始数据应该是零美元解析器- >setDefault (“empty_data”,);}/ /……}

太酷了!当使用ColorType形式,自定义数据映射器会创建一个新的方法颜色现在的对象。

谨慎

当有一种形式inherit_data选项设置为真正的,它不使用数据映射器,让它的父地图内部值。

有时,数据映射器需要访问服务或需要维护他们的状态。在这种情况下,您不能实现的方法类型本身。创建一个单独的类实现DataMapperInterface并初始化表单类型:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/ / src /形式/类型/ ColorType.php/ /……使用应用程序\形式\DataMapper\ColorMapper;最后ColorType扩展AbstractType{公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项){美元构建器/ /……/ /初始化数据映射器类,如通过一些状态- >setdatamap (ColorMapper (美元选项(“不透明度”)));}/ /……}
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。