从我阅读过的所有教程中,服务层似乎只有一个或两个方法,所以我不确定服务是否应该只是轻量级/瘦,而不是胖需要尽可能多的方法
如果我有一个Post
域对象并且有一个PostService
类,那么如果你想要删除帖子,你可以在控制器中做这件事:
$postService = $this->serviceFactory->build('post');
$postService->deletePost($id);
deletePost()
内的PostService
方法类似于:
$postMapper = $this->dataMapperFactory->build('post');
$post = $postMapper->fetchById($id);
// Check if the post exists
// Check if it belongs to this user
// Some other checks
$postMapper->delete($post);
这是对的吗?本质上,域对象只是值对象而所有工作都是在服务层中完成的吗?
任何帮助都会非常感谢。
答案 0 :(得分:3)
看来,你问题的一部分实际上是在地图制作者中。恕我直言,mappers不应该负责创建域对象。因此,您的示例代码实际上看起来应该更像:
$mapper = $this->dataMapperFactory->build('post');
$post = $this->domainObjectFactory->build('post');
$post->setId( $id );
$mapper->fetch($post);
// Check if the post exists
// Check if it belongs to this user
// Some other checks
$postMapper->delete($post);
此外,大多数“其他检查”实际上是在域对象上完成的。例如:
if ( $post->belongsTo($user) )
{
...
}
服务的作用是“应用程序逻辑”,这是描述域对象和映射器之间交互的术语。服务与其他服务交互也很常见。
拥有PostService
对我毫无意义。服务应该代表模型层中域业务逻辑的主要部分。
Recognition
服务,而不是UserService
和LoginService
。Content
服务而不是DocumentService
和CommentService
以及UserService
哦..而且,您不再需要添加..Service
或..Controller
个后缀。 PHP现在有名称空间。