gpt4 book ai didi

php - 服务之间应如何通信?

转载 作者:行者123 更新时间:2023-12-02 05:49:24 25 4
gpt4 key购买 nike

从@tereško的answer学习如何构建模型时,我找不到什么是服务之间通信的最佳方法。我还找到了this答案,这与我正在处理的情况类似,但该示例非常适合展示。因此,从这种意义上讲,例如,当服务只能访问域和映射器工厂对象时,如何在Blog服务内部检索识别服务。我可以从 Controller 发送吗?还是我也需要发送服务工厂?

更新:
我没有提供一个示例,因为我提到了tereško的第二个答案与我要达到的目标非常相似。我试图建立一个BlogService,例如存储一个帖子。为了存储帖子的作者,我试图检索(他称为)识别服务,以便获得登录的用户(显然是帖子的作者)。

class BlogService
{
public function storePost($title, $content)
{
$post = $this->domainFactory->build('Post');
$mapper = $this->mapperFactory->build('Post');

$post->setTitle($title);
$post->setContent($content);
$post->setAuthor( /* get logged in user */ );

$mapper->save($post);
}
}

最佳答案

理论

因此,基本上,您的问题是“如何与某些内容服务共享来自识别服务的域对象?”。我实际上已经思考了一段时间。

如我所见,这里有4个选项。两个卑鄙的人,一个好人,一个介于两者之间:

  • 前面提到过“通过服务工厂”方法。

    这是最幼稚的解决方案,因为在现实情况下,对象图的最终增长将变得不可控制,该图包含服务的服务包含广告。

    It's unsustainable, but quick.

  • 以这种方式更改识别服务,使其将Account实例吐回到 Controller ,然后该 Controller 又将其传递给其他服务。

    本质上,您最终会在层之间造成故意的泄漏,以最大程度地减少复杂性。您可以将其称为“体系结构非规范化”。

    It's a hack and a bad architecture.

  • 使用DI容器在服务之间共享域对象(甚至是映射器)。

    这种方式在前两个方面更为详尽,但也可以让您完全摆脱服务内部的工厂。

    Best option, but requires additional skill and code.

  • 使用域对象工厂仅一次创建Account(以及所有其他或选定的)实例。

    有点像this中的帖子,但用于域对象。当然,您将需要某种方式来绕过“缓存”,因为大量的域对象将需要具有多次启动的能力。因此-需要一些配置。

    A tricky half-way solution, but lets you keep familiar API within services.


  • 告白

    我本人当前正在使用选项2。其原因是我没有可以使用的DI容器(而我仅在5分钟前想到了“选项4”)。实际上,在“PHP DI容器”描述下看到的大多数内容实际上都是各种服务定位符(在这种情况下,无论如何,您最好还是有许多工厂)。

    如果您想使用DI容器,我的认可是 Auryn

    我自己不使用它的原因是,因为我真的很自大,所以我想制作自己的DI容器。

    附言

    而不是这样写:
     $post->setAuthor($user);

    您应该编写如下内容:
    $post->setAuthorId($user->getId());

    ..有两个原因:
  • 您没有使用 Activity 记录。因此,您不需要Post实例来管理它与其他实体的关系。那就是您要提供的服务。
  • 如果您传递了整个Account实例,则最终还是要提取ID。因此,您将违反Law of Demeter并没有实际好处。
  • 关于php - 服务之间应如何通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27493302/

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