从@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.
这种方式在前两个方面更为详尽,但也可以让您完全摆脱服务内部的工厂。
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());
..有两个原因:
Post
实例来管理它与其他实体的关系。那就是您要提供的服务。 Account
实例,则最终还是要提取ID。因此,您将违反Law of Demeter并没有实际好处。 关于php - 服务之间应如何通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27493302/