何时以及如何使用数据映射器
编辑本页警告:您正在浏览的文档欧宝官网下载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娱乐下载\组件\OptionsResolver\OptionsResolver;最后类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
选项设置为真正的
,它不使用数据映射器,而是让它的父节点映射内部值。