我目前正在研究DDD项目,最近遇到了有关使用DTO的问题。
我的域名中有以下DTO(代码在php中,但可以是任何语言):
class TranslationDto {
private $locale;
private $text;
public function getLocale(...);
public function getText(...);
}
目标是UI将为域提供带有语言环境及其相应文本的DTO。例如,如果语言环境" FR"未翻译,DTO将如下所示:
// UI => domain, for example when willing to persist the data (write)
TranslationDto [
'locale' => 'FR',
'text' => null,
]
现在的问题是:
在UI到域流程中,如果未翻译区域设置,则DTO的$text
值将为null
。
我在Domain-to-UI端实现了相同类型的逻辑,这意味着如果未翻译语言环境,则DTO的$text
值将为null
。
但是,我团队中的开发人员添加了一个回退逻辑,例如,如果FR
语言环境不存在,域将返回默认语言环境(例如EN)。返回的Domain-to-UI对象将如下所示:
TranslationDto [
'locale' => 'FR',
'text' => 'The fallback text, in english',
]
我对此感到尴尬,因为UI-to-domain" logic"将被域名转换为UI"逻辑"因此从开发人员的角度来看,我们在阅读时需要小心这个DTO,因为我们现在不会它是后退还是没有。换句话说:我们真的无法信任"这个DTO。
另一方面,这个回退逻辑在UI层更方便,因为UI在从域请求后不会关心翻译对象:它将始终包含正确的文本。
此外,由于我们需要管理这些翻译(例如在管理员后端),我们现在将有2个端点而不是一个:一个用于请求DTO与他们的"真实"值(没有后备),以及一个用它们的后备值请求它们。
你们怎么看待这种方法,哪种方法是最好的做法?或者有更好的替代方法吗?
干杯
答案 0 :(得分:1)
首先,您不应该查询您的域名,因此DTO应该只是用于UI到域。
事情的查询方面可能很好地返回一些简单的结构来表示数据,但意图是不同的。由于域不会提供此区域设置数据,您最终可能会生成本地化文件以便直接查询,然后在前端执行回退(例如在SPA情况下),或者您生成的主本地化文件已包含回退
即使您要返回一些结构,甚至是DTO,并且您决定在服务器上执行回退,提供回退文本或指示提供的文本是回退值可能很有用,所以:
{
locale: 'fr',
text: undefined,
fallback: 'Anglais'
}
,或者
{
locale: 'fr',
text: 'Anglais',
fallback: true
}
我在SPA解决方案中所做的通常是在内部使用i18next.js
和 it ,因为提供了回退区域设置,因此负责回退。如果缺少所请求的资源,则检索回退;否则显示请求的密钥。
无论如何,只是一些想法:)