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

编辑该页面

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

一种复合时,初始数据需要传递给每个孩子可以显示自己的输入值。提交,孩子们的价值观需要写回的形式。

数据映射器负责读写数据,进入父母形式。

主要的内置数据映射器使用PropertyAccess组件并将适合大多数情况下。但是,您可以创建您自己的实现,例如,通过提交数据,通过它们的构造函数不可变对象。

数据变压器和映射器的区别

知道之间的区别是很重要的数据变形金刚和映射器。

  • 数据变形金刚改变一个值的表示形式,例如“2016-08-12”到一个DateTime实例;
  • 数据映射器地图数据(例如,一个对象或数组)一个或多个表单字段,反之亦然,例如使用单一DateTime实例来填充内心的字段(e。g,小时等)的复合类型。

创建一个数据映射器

假设您想要保存到数据库的一组颜色。为此,你使用一个不可变的颜色对象:

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名称空间应用程序\形式;使用应用程序\绘画\颜色;使用欧宝娱乐app下载地址\组件\形式\AbstractType;使用欧宝娱乐app下载地址\组件\形式\DataMapperInterface;使用欧宝娱乐app下载地址\组件\形式\异常\UnexpectedTypeException;使用欧宝娱乐app下载地址\组件\形式\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名称空间应用程序\形式\类型;/ /……使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\IntegerType;使用欧宝娱乐app下载地址\组件\形式\FormBuilderInterface;使用欧宝娱乐app下载地址\组件\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形式,自定义数据映射器会创建一个新的方法颜色现在的对象。

使用回调函数映射表单字段

方便,你也可以从地图数据和表单字段使用gettersetter选项。例如,假设您有一个表单和一些字段,只有其中一个需要映射在某些特殊的方式或者你只需要改变它的写入底层对象。在这种情况下,注册一个PHP调用,可以写或读/从特定对象:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项){/ /……美元构建器- >add (“状态”,ChoiceType::类,“选择”= > [“活跃”= >真正的,“暂停”= >),“getter”= >函数(任务美元任务,FormInterface美元形式):bool{返回!美元任务- >isCancelled () & & !美元任务- >isPaused ();},“setter”= >函数(任务&美元任务bool,美元状态,FormInterface美元形式):无效{如果(美元状态){美元任务- >激活();}其他的{美元任务- >暂停();}});}

如果可用,这些选项有优先于财产路径访问器和默认的数据映射器仍将使用PropertyAccess组件其他表单字段。

谨慎

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

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
欧宝娱乐app下载地址Symfony 6.2支持通过苏禄人
欧宝娱乐app下载地址Symfony 6.2支持通过Les-Tilleuls.coop