Forms Symfony2:这些方法学之间的区别;“嵌入形式”;及;“数据转换器”;

Forms Symfony2:这些方法学之间的区别;“嵌入形式”;及;“数据转换器”;,forms,service,symfony,Forms,Service,Symfony,考虑以下场景 我们有一个包含两个实体的简单数据库:user和category 对于我们的假设,假设一个用户只能有一种类型的类别,一个类别可以与n个用户关联 现在,考虑一个网页,其中用户< /代码> ->代码> RoLyAuthor 可以编辑用户表并将它们关联到一个不同的代码类别>代码> < BR> 据我所知(一般来说,我对symfony还是新手),如果我同时使用条令和symfony2,以及——比方说——注释方法,我将有两个实体(php类) 嵌入式表单 我将创建一个表单来显示用户,当然,对于sh

考虑以下场景

我们有一个包含两个实体的简单数据库:
user
category

对于我们的假设,假设一个
用户
只能有一种类型的
类别
,一个
类别
可以与n个
用户
关联

现在,考虑一个网页,其中<代码>用户< /代码> ->代码> RoLyAuthor <代码>可以编辑用户表并将它们关联到一个不同的代码<代码>类别>代码> < BR> 据我所知(一般来说,我对symfony还是新手),如果我同时使用条令和symfony2,以及——比方说——注释方法,我将有两个实体(php类)


嵌入式表单
我将创建一个表单来显示
用户
,当然,对于show-和persist!-另外,他的
类别
I“选择”遵循“嵌入形式”策略
既然已经创建了实体,我就必须为
类别
创建一个表单(假设在
formBuilder
中我只添加
类别
id
属性)。
在此之后,我必须向UserType类的
formBuilder
中添加上一个表单,并使用“某种魔法”将表单呈现(在适当的操作之后)为魔法,就像魔法一样,当我将其发布(并绑定等)回来时,所有信息都将持久存在数据库中

数据转换器
A.K.A.将表单的输入转化为对象,反之亦然。
这样,我就必须定义一个——比方说——
CategorySelectorType
,它将添加一个类(服务?)来完成这些转换
现在我们定义了数据转换器本身,它将实现
DataTransofmerInterface
(使用他的方法等等…
下一步是将该实体注册到服务中,并将其添加到将使用该服务的表单中



所以我不理解这两种方法之间有什么“强烈”的区别,而是理解服务的“可重用性”。有人可以向我提供不同的观点,并解释其中的差异(如果有的话)

数据转换器并不能取代嵌入式表单,而是可以很好地增强表单并包装数据转换。

上面的第一句话很好地概括了这一点:

您经常会发现需要转换用户在 将表单转换为其他内容,以便在程序中使用

在上面的示例中,您可以添加类别的下拉列表,以便管理员可以为给定用户选择一个类别。这将使用嵌入的表单来完成。由于category字段是现有类别的id,因此无需转换数据

出于某种原因,您现在希望管理员能够输入该类别的自由文本。现在您需要将文本转换成所讨论的对象。也许您希望他能够使用此文本字段添加新类别或选择当前类别。这两种方法都可以通过使用数据转换器来实现,该转换器获取文本并搜索类别。根据您的需要,可以创建并返回不存在的类别

另一个用例是当用户输入需要在存储数据之前以某种方式修改的数据时。假设用户输入街道、门牌号和城市,但您希望存储坐标

在这两种情况下,是否将表单嵌入另一个表单并不重要

你能在你的控制器里做吗?当然在控制器中执行此类操作是一个好主意吗?可能不会,因为您很难进行测试(在transformer中进行测试时,您可以很好地对转换进行单元测试)或重用它

更新

当然,也可以将转换代码放在其他地方。用户对象本身不是一个好地方,因为模型不应该知道实体管理器,而实体管理器是进行转换所必需的。 用户类型是可能的,但这意味着它与实体管理器绑定


所有这些都构成了一个非常强大的概念,即一个类应该只做一件事来使其可维护、可恢复、可测试等等。如果您遵循这一概念,那么应该很清楚,数据转换本身就是一件事情,因此应该受到威胁。如果您不在乎,您可能不需要转换功能。

也许我没有用正确的方式表达自己。你说的我很清楚,顺便说一句,谢谢你的回答。但我不会将“转换代码”直接添加到控制器中。我的意思是,如果我添加一个方法来进行这种转换,直接进入,比如说,
用户对象
或者进入
用户类型(表单类)
,然后嵌入表单,你给我列出的这种差异仍然有效吗?好的,我想这是一个很好且丰富的答案。让我们看看是否有人给我提供了更好的东西。现在,谢谢你+1.