3

考虑以下场景

我们有一个简单的数据库,它涉及两个实体:usercategory.
对于我们的假设,假设 auser可以只有一种类型,category并且 acategory可以与n users相关联。

现在,考虑一个网页,其中 a user-say-ROLE_ADMINISTRATOR可以编辑用户表并将它们关联到不同的表category
据我所知(而且我对 symfony 还是很陌生),如果我同时使用 Doctrine 和 symfony2,使用 - 比方说 - 注释方法,我将有两个实体(php 类)。


嵌入式表单
我将创建一个表单,它会显示user并且,为了显示 - 当然会持续存在!- 也是他category我“选择”遵循“嵌入形式”的策略。
话虽如此,实体已经创建,我将不得不创建一个表单category(假设formBuilder我将只添加id的属性category)。
之后,我必须将formBuilder前一个表单添加到 UserType 类中,并且通过“某种魔法”,表单将(在适当的操作之后)呈现为魔法,就像魔法一样,当我发布它时(并绑定,和依此类推)返回所有信息将持久保存到数据库中

数据转换
器 AKA 将表单的输入转换为对象,反之亦然。
这样,我将不得不在他的构建器中定义一个 - 比方说 -CategorySelectorType将添加一个将执行这些转换的类(服务?)。
现在我们定义数据转换器本身,它将实现DataTransofmerInterface(使用他的方法等等......)
下一步将该实体注册到服务中并添加到UserType将使用该服务的表单中。


所以我不明白这两种方法之间的任何“强烈”区别,而是服务的“可重用性”。有人可以为我提供不同的观点并解释我的差异,如果有的话?

4

1 回答 1

2

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

食谱页面上关于数据转换器的第一句话很好地总结了它:

您经常会发现需要将用户在表单中输入的数据转换为其他内容以便在您的程序中使用。

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

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

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

在这两种情况下,您是否将表单嵌入到另一个中都没关系!

你能在你的控制器中做到这一点吗?当然。在控制器中做这些事情是个好主意吗?可能不会,因为您很难进行测试(在转换器中进行测试时,您可以很好地对转换进行单元测试)或重用它。

更新

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

这一切都构成了一个非常强大的关注点分离概念,它指出一个类应该只做一件事以使其可维护、可重复、可测试等。如果您遵循这个概念,那么应该清楚数据转换本身就是一件事情,因此应该受到威胁。如果您不在乎,您可能不需要转换功能。

于 2012-07-03T08:42:58.603 回答