如何使用数据变形金刚吗
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.4,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
如何使用数据变形金刚吗
你常常会发现需要变换中用户输入的数据形成别的程序使用。你可以很容易地做这个手动控制器,但是如果你想使用这个特定的形式在不同的地方吗?
说你有一个一对一的关系问题的任务,例如,一个任务可以选择有一个问题有关。添加一个列表框与所有可能的问题最终会导致很长是不可能找到的列表框。你可能想添加一个文本框,用户可以输入号码的问题。
你可以试着这样做在你的控制器,但这不是最好的解决方案。它会更好,如果这个问题自动转换为一个对象问题。这就是《变形金刚》发挥作用的数据。
创建一个变压器
首先,创建一个IssueToNumberTransformer
这个类将负责号码和转换的问题问题
对象:
1 2 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 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 64 65 66 67 68
/ / src / Acme / TaskBundle /形式/ DataTransformer / IssueToNumberTransformer.php名称空间Acme\TaskBundle\形式\DataTransformer;使用ob娱乐下载\组件\形式\DataTransformerInterface;使用ob娱乐下载\组件\形式\异常\TransformationFailedException;使用学说\常见的\持久性\ObjectManager;使用Acme\TaskBundle\实体\问题;类IssueToNumberTransformer实现了DataTransformerInterface{/ * * *@varObjectManager * /私人美元om;/ * * *@paramObjectManager om * /美元公共函数__construct(ObjectManager美元om){美元这- >om =美元om;}/ * * *转换对象(问题),一个字符串(数值)。”* *@param*问题|零美元问题@return字符串* /公共函数变换(美元问题){如果(零= = =美元问题){返回”“;}返回美元问题- >getNumber ();}/ * * *转换字符串(数量)一个对象(问题)。* *@param字符串$ * *@return问题|空* *@throws没有找到TransformationFailedException如果对象(问题)。* /公共函数reverseTransform(美元数量){如果(!美元数量){返回零;}美元问题=美元这- >om- >getRepository (“AcmeTaskBundle:问题”)- >findOneBy (数组(“数量”= >美元数量));如果(零= = =美元问题){扔新TransformationFailedException (sprintf (的数量的问题“% s”不存在!”,美元数量));}返回美元问题;}}
提示
如果你想要创建一个新问题进入一个未知号码时,您可以实例化它,而不是扔TransformationFailedException
。
请注意
当零
传递给变换()
方法,你的变压器应该返回一个等价的值的类型是改变(如一个空字符串,0为整数或0.0浮动)。
使用变压器
现在你有变压器,你只需要将它添加到您的问题以某种形式。
您还可以使用变压器没有通过调用创建一个新的自定义表单类型addModelTransformer
(或addViewTransformer
——看模型和视图变形金刚在任何领域构建器):
1 2 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 32 33 34 35 36 37 38
使用ob娱乐下载\组件\形式\FormBuilderInterface;使用Acme\TaskBundle\形式\DataTransformer\IssueToNumberTransformer;类TaskType扩展AbstractType{公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项){/ /……/ /实体管理器通过这个假设作为一个选项美元entityManager=美元选项(“新兴市场”];美元变压器=新IssueToNumberTransformer (美元entityManager);/ /添加一个普通的文本字段,但是加上你的变压器美元构建器- >add (美元构建器- >创建(“问题”,“文本”)- >addModelTransformer (美元变压器));}公共函数setDefaultOptions(OptionsResolverInterface美元解析器){美元解析器- >setDefaults (数组(“data_class”= >“Acme实体\ TaskBundle \ \任务”,))- >setRequired (数组(“新兴市场”,))- >setAllowedTypes (数组(“新兴市场”= >“教义\常见\ \ ObjectManager持久性”));/ /……}/ /……}
本例要求您通过在实体管理器作为一个选项创建表单。之后,您将了解如何创建一个定制的问题
字段类型,以避免需要这样做在你的控制器:
1 2 3
美元taskForm=美元这- >createForm (新TaskType (),美元任务,数组(“新兴市场”= >美元这- >getDoctrine ()- >getManager ()));
酷,你已经完成了!用户可以在文本框中输入一个问题数量,它将被转换回一个问题对象。这意味着,表单提交成功后,框架将通过一个真正的问题对象任务::setIssue ()
而不是数量的问题。
如果这个问题没有发现,将会创建一个形状误差对该字段及其错误消息可以控制的invalid_message
场的选择。
谨慎
注意,添加一个变压器需要使用一个稍微复杂的语法当添加。下面是错误的,随着变压器将应用于整个表单,而不是仅仅这一领域:
1 2 3 4
/ /这是错误的——变压器将适用于整个表单/ /上面看到正确的代码示例美元构建器- >add (“问题”,“文本”)- >addModelTransformer (美元变压器);
模型和视图变形金刚
在上面的例子中,变压器被用作变压器“模型”。事实上,有两个不同类型的变压器和三种不同类型的基础数据。
在任何形式,三种不同类型的数据:
- 模型数据——这是在应用程序中使用的数据格式(如一个
问题
对象)。如果你叫形式:getData
或形式:setData
,你在处理“模型”的数据。 - 规范数据——这是一个数据的归一化版本,和通常一样的“模型”数据(虽然不是在我们的示例中)。它不是常用的直接。
- 视图数据——这是用来填写表单字段的格式,自己。这也是用户提交数据的格式。当你打电话
形式:提交(元数据)
,元数据
在“视图”数据格式。
两种不同类型的变压器帮助转换与每一种类型的数据:
- 变形金刚模型:
-
变换
:“模型数据”= >“规范数据”reverseTransform
:“规范数据”= >“模型数据”
- 看变形金刚:
-
变换
:“规范数据”= >“查看数据”reverseTransform
:“查看数据”= >“规范数据”
变压器需要取决于您的情况。
使用视图变压器,电话addViewTransformer
。
为什么使用模型的变压器?
在这个例子中,字段是一个文本
领域,一个文本字段总是将一个简单的、标量格式在“规范”和“视图”格式。出于这个原因,“模型”是最合适的变压器变压器(的/转换<新兴市场>规范新兴市场>格式-字符串问题数字的<新兴市场>模型新兴市场>格式-问题对象)。
变压器的区别是微妙的,你应该考虑的“常态”数据字段应该是。例如,“规范”的数据文本
字段是一个字符串,但是是一个DateTime
对象的一个日期
字段。
在一个自定义字段类型使用变压器
在上面的示例中,您使用变压器正常文本
字段。这是容易的,但有两个缺点:
1)你需要永远记住应用变压器当你添加一个数字字段问题。
2)你需要担心的新兴市场
选择当你创建一个表单,使用变压器。
因为这些,你可以选择创建一个自定义字段类型。首先,创建自定义字段类型类:
1 2 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47岁
/ / src / Acme / TaskBundle /形式/类型/ IssueSelectorType.php名称空间Acme\TaskBundle\形式\类型;使用ob娱乐下载\组件\形式\AbstractType;使用ob娱乐下载\组件\形式\FormBuilderInterface;使用Acme\TaskBundle\形式\DataTransformer\IssueToNumberTransformer;使用学说\常见的\持久性\ObjectManager;使用ob娱乐下载\组件\OptionsResolver\OptionsResolverInterface;类IssueSelectorType扩展AbstractType{/ * * *@varObjectManager * /私人美元om;/ * * *@paramObjectManager om * /美元公共函数__construct(ObjectManager美元om){美元这- >om =美元om;}公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项){美元变压器=新IssueToNumberTransformer (美元这- >om);美元构建器- >addModelTransformer (美元变压器);}公共函数setDefaultOptions(OptionsResolverInterface美元解析器){美元解析器- >setDefaults (数组(“invalid_message”= >“不存在选择的问题”));}公共函数getParent(){返回“文本”;}公共函数getName(){返回“issue_selector”;}}
接下来,注册您的类型作为服务和标签form.type
所以它是公认的一个自定义字段类型:
1 2 3 4 5 6
服务:acme_demo.type.issue_selector:类:Acme \ TaskBundle \ \ \ IssueSelectorType型形式参数:(“@doctrine.orm.entity_manager”)标签:- - - - - -{名称:form.type,别名:issue_selector}
1 2 3 4
<服务id=“acme_demo.type.issue_selector”类=“Acme \ TaskBundle \ \ \ IssueSelectorType型”><论点类型=“服务”id=“doctrine.orm.entity_manager”/ ><标签的名字=“form.type”别名=“issue_selector”/ >< /服务>
1 2 3 4 5 6 7 8
美元容器- >setDefinition (“acme_demo.type.issue_selector”,数组(新引用(“doctrine.orm.entity_manager”)))- >addTag (“form.type”,数组(“别名”= >“issue_selector”));
现在,当你需要使用你的特别issue_selector
字段类型,它很简单:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/ / src / Acme / TaskBundle /形式/类型/ TaskType.php名称空间Acme\TaskBundle\形式\类型;使用ob娱乐下载\组件\形式\AbstractType;使用ob娱乐下载\组件\形式\FormBuilderInterface;类TaskType扩展AbstractType{公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项){美元构建器- >add (“任务”)- >add (“dueDate”,零,数组(“部件”= >“single_text”))- >add (“问题”,“issue_selector”);}公共函数getName(){返回“任务”;}}