首页 > 解决方案 > 带有 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,如果没有生成它自己的。但我不确定这是一个好习惯。

如果有人有一些意见,我会很高兴阅读它:)

标签: phpdomain-driven-designuuidapi-design

解决方案


你应该明白为什么在客户端生成 uuid 是件好事,对我来说最大的好处是允许做异步或复杂的事情。例如,客户端可以向服务器发送请求,而无需等待响应,开始使用生成的 uuid,这种方法可以让客户端从 uuid 以及您的 php 应用程序开始使用时获得很多好处uuid 而不是 dd,因为您不再需要并且可以发送事件。另外,还有一种中间方案,在创建命令的同时在控制器中生成uuid。还有一个更有趣的概念:命令永远不会失败。


推荐阅读