何时以及如何使用数据映射器
编辑本页何时以及如何使用数据映射器
复合表单时,需要将初始数据传递给子表单,以便每个子表单都能显示自己的输入值。在提交时,需要将子值写回表单中。
数据映射器负责从父表单读取和写入数据。
主要的内置数据映射器使用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娱乐下载\组件\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
表单中,自定义数据映射器方法将创建一个新的颜色
现在的对象。
使用回调映射表单字段
方法还可以方便地将数据从表单字段映射到表单字段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
选项设置为真正的
,它不使用数据映射器,而是让它的父节点映射内部值。