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

编辑本页

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

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

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

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

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

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

  • 数据变形金刚改变单个值的表示,例如from“2016-08-12”到一个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显示数据, \可反驳的形式无效//还没有数据,所以没有什么要预填充如果===显示数据) {返回;}//无效的数据类型如果(!显示数据运算符颜色){UnexpectedTypeException (显示数据,颜色::类);}/**@varFormInterface[] $forms */形式= iterator_to_array (形式);//初始化表单字段值形式“红色”->setData (显示数据->getRed ());形式“绿色”->setData (显示数据->getGreen ());形式“蓝”->setData (显示数据->getBlue ());}公共函数mapFormsToData(\可反驳的形式, &显示数据无效/**@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表单中,自定义数据映射器方法将创建一个新的颜色现在的对象。

使用回调映射表单字段

方法还可以方便地将数据从表单字段映射到表单字段getter而且setter选项。例如,假设您有一个带有一些字段的表单,其中只有一个字段需要以某种特殊的方式映射,或者您只需要更改将其写入底层对象的方式。在这种情况下,注册一个能够读写特定对象的PHP可调用对象:

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

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

谨慎

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

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。
ob娱乐下载Symfony 6.0支持通过SensioLabs