Symfony 5:在实体中使用数据转换器的推荐模式

Symfony5: Recommended pattern for using DataTransformers within Entities

我目前正在尝试使我们的 Symfony 项目类型安全,从而对其进行一些重构,因为它到处使用了一些反模式。我的问题是我无法想出一个好的模式来转换实体属性。让我详细说明一下:

让我们以我们的语言实体为例:

现在的目标是在它们的实际对象和用户友好的字符串表示之间转换实体实例,例如在 LanguageTranslation 表单中用于有一个文本字段,您可以在其中通过其用户友好的字符串表示形式(使用名称 属性)与预输入 select Language

为了解决这个问题,我创建了一个 LanguageDataTransformer,它通过简单地返回 属性 或空字符串。 reverseTransform 也很简单:它接受名称并在数据库中搜索具有给定名称 属性 和 returns 的语言,如果不存在则抛出异常。然后使用 addModelTransformer-函数将此 DataTransformer 应用于正确的表单字段。

虽然这对于处理外部表单输入和内部实体对象之间的转换非常有用,我们还通过将实体转换为属性的数据数组来以通用方式“序列化”我们的实体[= toArray() 函数中的 66=] (标量类型不变,但对象的用户友好字符串)。逆向也存在将这样的数据数组转换回其实体对象。这是必需的,因为我们 export/import 实体 from/to 不同的格式(例如 JSON)。

因为这基本上是与表单处理中相同的转换(例如,对于语言字段),所以我尝试重用已经编写的 DataTransformer。现在的问题是我无法将 LanguageDataTransformer 嵌入到 LanguageTranslation 实体中。 Transformer 内部使用 EntityManager,因此它需要通过 Symfony 自动装配来实例化。 如何让 Symfony 在我的实体中自动装配 Transformer? 特别是考虑到 fromArray-方法是静态的(因为它就像一个工厂来构造实体),但需要访问构建过程的实例化转换器。

如果能提示正确的模式,我将非常高兴。 提前致谢!

我发现了我的问题: 我们的实体是手动实例化的(即通过调用 new LanguageTranslation() 之类的东西),因此 Symfony 无法为这些实体实例化所需的服务。

我决定将每个实体的 import/export 逻辑(即 toArrayfromArray)提取到一个单独的服务 class,然后可以在代码中需要 import/export 个位置。这样所需的依赖项由 Symfony 注入,实体或其数据数组分别作为参数传入。这也导致更好的松散耦合和关注点分离。