gpt4 book ai didi

forms - Symfony2 : Difference between those metodology "Embedded Form" and "Data Transformer"

转载 作者:行者123 更新时间:2023-12-01 08:08:59 26 4
gpt4 key购买 nike

考虑以下场景

我们有一个简单的数据库,它涉及两个实体:usercategory
对于我们的假设,假设一个 user 只能有一个类型的 category 并且一个 category 可以与 n 用户

现在,考虑一个网页,其中一个用户 - 比如ROLE_ADMINISTRATOR - 可以编辑用户表并将它们关联到不同的类别
据我所知(一般来说我对 symfony 还是个新手)如果我串联使用 Doctrine 和 symfony2,以及 - 让我们说 - 注释方法,我将有两个实体(php 类)。


嵌入形式
我将创建一个表单来显示 user 并且为了显示 - 当然要坚持! - 也是他的 类别 我“选择”遵循“嵌入形式”策略。
已经说过实体已经创建,我必须为 category 创建一个表单(假设在 formBuilder 中我将只添加 id 类别的属性)。
之后,我必须将以前的表单添加到 UserType 类的 formBuilder 中,并且通过“某种魔法”,该表单将(在适当的操作之后)呈现为魔法,就像魔法一样,当我将其发布(并绑定(bind)等)所有信息将持久保存到数据库中

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


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

最佳答案

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

关于cookbook page about Data Transformers的第一句话总结得很好:

You'll often find the need to transform the data the user entered in a form into something else for use in your program.

在上面的示例中,您可以添加类别下拉列表,以便管理员可以为给定用户选择一个类别。这将使用嵌入式表格来完成。由于category字段是已经存在的category的id,所以不需要转换数据。

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

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

在这两种情况下,将表单嵌入另一个都没有关系!

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

更新

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

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

关于forms - Symfony2 : Difference between those metodology "Embedded Form" and "Data Transformer",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11260257/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com