php - 带有 API 的 DDD 和 UUID:在客户端或服务器端生成?
问题描述
在我的工作中,我们目前正在努力在 Web 应用程序中使用 uuid 生成方法。我们做 DDD,我们的持久存储是我们拥有的远程 API。
这是我的代码的简化示例:
class HireFooHandler() {
private $repository;
private $mailer;
public function __construct(FooRepository $repository, HiringMailer $mailer, ... ) {
$this->repository = $repository; //behind the repository, there are api calls
$this->mailer = $mailer;
...
}
public function handle(HireFooCommand $command) {
try {
$foo = new Foo($command->uuid, $command->baz, ...);
$this->repository->hire($foo);
$this->mailer->sendHiredMail($foo);
...
} catch(...) {
...
}
}
}
我的一些同事对生成 uuid 并将其发送到 api 的应用程序不满意。他们更喜欢让服务器端处理 uuid 生成,如果在此示例中保存了“foo”,则在响应中将生成的 uuid 发送回应用程序。主要论点是,api 也将是公开的,他们不希望客户端必须生成 uuid。
另一方面,从我的应用程序和编码的角度来看,由于我的实体 Foo 不应该处于无效状态,要创建它,我必须提供 uuid 并从客户端生成它,我认为没关系。
所以我在这里,为此苦苦挣扎,不知道什么是最好的方法,以及在哪里生成我的 uuid?客户端 ?服务器端 ?
我建议他们通过在可以验证的 post 端点中添加一个 uuid 可选字段来使 api 更加灵活。所以 Api 可以从客户端接收一个 uuid,如果没有生成它自己的。但我不确定这是一个好习惯。
如果有人有一些意见,我会很高兴阅读它:)
解决方案
你应该明白为什么在客户端生成 uuid 是件好事,对我来说最大的好处是允许做异步或复杂的事情。例如,客户端可以向服务器发送请求,而无需等待响应,开始使用生成的 uuid,这种方法可以让客户端从 uuid 以及您的 php 应用程序开始使用时获得很多好处uuid 而不是 dd,因为您不再需要并且可以发送事件。另外,还有一种中间方案,在创建命令的同时在控制器中生成uuid。还有一个更有趣的概念:命令永远不会失败。
推荐阅读
- ubuntu-16.04 - 如何使用 Xilinx Petalinux SDK 解决“无法获取 Bitbake 源”
- mongodb - 部署无效的 Terraform + Kubernetes:spec.template.spec.containers[0].envFrom:无效值:“”
- arrays - Excel VBA ARRAY 循环到数据库
- javascript - JavaScript https 获取请求
- react-native - 如何在 react-native 中从浏览器向 Android App 传递一些数据
- java - 我的应用程序从后台回调时显示 ArrayIndexOutOfBoundsException
- android - 如何将我的网站深度链接到应用程序?
- node.js - 将当前用户的 ID 获取到 NodeJS 中方法的 URL
- jupyter-notebook - 一个完整的初学者 - 不能安装 Jupyter 笔记本
- scheme - 方案,连续分数,尾递归