如何使用数据转换器
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 5.1,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
如何使用数据转换器
数据转换器用于将字段的数据转换为可以在表单中显示的格式(并在提交时返回)。它们已经在内部用于许多字段类型。例如,DateType字段可以呈现为yyyy-MM-dd
格式的输入文本框。在内部,数据转换器转换启动DateTime
字段的值yyyy-MM-dd
字符串来呈现窗体,然后返回为DateTime
对象在提交时。
谨慎
属性时inherit_data
选项设置为真正的
,数据转换器并不应用于该领域。
另请参阅
如果不是转换值的表示形式,而是需要将值映射到表单字段并返回,则应该使用数据映射器。看看何时以及如何使用数据映射器.
示例#1:将字符串从用户输入的数据标签转换为数组
假设您有一个带有标记的Task表单文本
类型:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
/ / src /形式/类型/ TaskType.php名称空间应用程序\形式\类型;使用应用程序\实体\任务;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;使用ob娱乐下载\组件\形式\FormBuilderInterface;使用ob娱乐下载\组件\OptionsResolver\OptionsResolver;/ /……类TaskType扩展AbstractType{公共函数buildForm(FormBuilderInterface$构建器数组,$选项):无效{$构建器->add (“标签”, TextType::类);}公共函数configureOptions(OptionsResolver$解析器):无效{$解析器->setDefaults ([“data_class”= >任务::类,]);}/ /……}
在内部的标签
存储为数组,但显示给用户为逗号分隔的普通字符串,以便于编辑。
这是一个完美的对象上附加自定义数据转换器的时间到了标签
字段。最简单的方法是用CallbackTransformer类:
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
/ / src /形式/类型/ TaskType.php名称空间应用程序\形式\类型;使用ob娱乐下载\组件\形式\CallbackTransformer;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;使用ob娱乐下载\组件\形式\FormBuilderInterface;/ /……类TaskType扩展AbstractType{公共函数buildForm(FormBuilderInterface$构建器数组,$选项):无效{$构建器->add (“标签”, TextType::类);$构建器->get (“标签”)->addModelTransformer (新CallbackTransformer (函数($tagsAsArray){//将数组转换为字符串返回内爆(”、“,$tagsAsArray);},函数($tagsAsString){//将字符串转换回数组返回爆炸(”、“,$tagsAsString);}));}/ /……}
的CallbackTransformer
接受两个回调函数作为参数。第一个函数将原始值转换为用于呈现字段的格式。第二种则相反:它将提交的值转换回您将在代码中使用的格式。
提示
的addModelTransformer ()
方法接受任何实现的对象DataTransformerInterface-所以你可以创建自己的类,而不是把所有的逻辑都放在表单中(见下一节)。
你也可以添加转换器,在添加字段时稍微改变格式:
1 2 3 4 5 6 7
使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;$构建器->add ($构建器->创建(“标签”, TextType::类)->addModelTransformer(…));
示例#2:将问题编号转换为问题实体
假设你有一个从任务实体到问题实体的多对一关系(即每个任务都有一个可选的外键指向其相关的问题)。添加一个包含所有可能问题的列表框最终会得到真的时间长,加载时间长。相反,您决定添加一个文本框,用户可以在其中输入问题编号。
首先像往常一样设置文本字段:
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
/ / src /形式/类型/ TaskType.php名称空间应用程序\形式\类型;使用应用程序\实体\任务;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextareaType;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;/ /……类TaskType扩展AbstractType{公共函数buildForm(FormBuilderInterface$构建器数组,$选项):无效{$构建器->add (“描述”, TextareaType::类)->add (“问题”, TextType::类);}公共函数configureOptions(OptionsResolver$解析器):无效{$解析器->setDefaults ([“data_class”= >任务::类,]);}/ /……}
好的开始!但如果你停在这里,提交表单,任务问题
属性将是一个字符串(例如:“55”)。你怎么把这个转化成问题
实体提交?
创建变压器
你可以使用CallbackTransformer
就像早些时候。但是由于这有点复杂,因此创建一个新的转换器类将保留TaskType
形式类更简单。
创建一个IssueToNumberTransformer
类:它将负责从发行号和问题
对象:
12 34 56 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 53 54 55 56 57 58 59 60 61 62 63
/ / src /形式/ DataTransformer / IssueToNumberTransformer.php名称空间应用程序\形式\DataTransformer;使用应用程序\实体\问题;使用学说\ORM\EntityManagerInterface;使用ob娱乐下载\组件\形式\DataTransformerInterface;使用ob娱乐下载\组件\形式\异常\TransformationFailedException;类IssueToNumberTransformer实现了DataTransformerInterface{私人$entityManager;公共函数__construct(EntityManagerInterface