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

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 5.1,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

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

复合表单时,需要将初始数据传递给子表单,以便每个子表单都能显示自己的输入值。在提交时,需要将子值写回表单中。

数据映射器负责从父表单读取和写入数据。

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

数据转换器和映射器的区别

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

  • 数据变形金刚改变一个值的表示(例如从“2016-08-12”到一个DateTime实例);
  • 数据映射器将数据(例如对象或数组)映射为字段,反之亦然。

改变一个YYYY-mm-dd字符串值。DateTime实例是由数据转换器完成的。类填充复合日期类型的内部字段(例如年、小时等)DateTime实例是由数据映射器完成的。

创建数据映射器

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

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 31
/ / src /绘画/ Color.php名称空间应用程序绘画最后颜色私人红色的私人绿色私人蓝色的公共函数__construct(int红色的, int绿色, int蓝色的->红色=红色的->绿色=绿色->蓝色=蓝色的;}公共函数getRed()int返回->红色;}公共函数getGreen()int返回->绿色的;}公共函数getBlue()int返回->蓝色;}}

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

提示

如果使用带有构造函数参数的可变对象,而不是使用数据映射器,则应该配置empty_data中所描述的闭包如何为窗体类配置空数据

红色、绿色和蓝色表单字段必须映射到构造函数参数和颜色实例必须映射到红色、绿色和蓝色表单字段。是否认识到一个熟悉的模式?现在是时候使用数据映射器了。最简单的创建方法是实现DataMapperInterface在你的表单中输入:

12 34 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/ /……/ * * *@paramColor|null $viewData */公共函数mapDataToForms显示数据, iterable形式无效//还没有数据,所以没有什么要预填充如果= = =显示数据) {返回;}//无效的数据类型如果(!显示数据运算符颜色){UnexpectedTypeException (显示数据,颜色::类);}/**@varFormInterface[] $forms */形式= iterator_to_array (形式);//初始化表单字段值形式“红色”->setData (显示数据->getRed ());形式“绿色”->setData (显示数据->getGreen ());形式“蓝”->setData (显示数据->getBlue ());}公共函数mapFormsToData(iterable形式, &显示数据无效/**@varFormInterface[] $forms */形式= iterator_to_array (形式);//当数据通过引用传递时,覆盖它将在//表单对象//注意类型不一致,参见下面的caution显示数据颜色(形式“红色”->getData (),形式“绿色”->getData (),形式“蓝”->getData ());}}

谨慎

传递给映射器的数据为尚未验证.这意味着您的对象应该允许在无效状态下创建,以便在表单中产生用户友好的错误。

使用Mapper

创建数据映射器之后,您需要配置表单来使用它。这是使用setdatamap ()方法:

12 34 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娱乐下载组件OptionsResolverOptionsResolver最后ColorType扩展AbstractType实现了DataMapperInterface公共函数buildForm(FormBuilderInterface构建器数组,选项无效构建器->add (“红色”, IntegerType::类,//执行类型的严格性以确保构造函数// Color类不会中断“empty_data”= >' 0 ',)->add (“绿色”, IntegerType::类,“empty_data”= >' 0 ',)->add (“蓝”, IntegerType::类,“empty_data”= >' 0 ',)//为这个表单类型配置数据映射器->setdatamap ();}公共函数configureOptions(OptionsResolver解析器无效//当创建一个新的颜色时,初始数据应该为空解析器->setDefault (“empty_data”);}/ /……

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

谨慎

当表单具有inherit_data选项设置为真正的,它不使用数据映射器,而是让它的父节点映射内部值。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。