服务层是我所有真正的方法吗?

时间:2013-02-17 13:16:55

标签: php oop domain-driven-design datamapper

从我阅读过的所有教程中,服务层似乎只有一个或两个方法,所以我不确定服务是否应该只是轻量级/瘦,而不是胖需要尽可能多的方法

如果我有一个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);

这是对的吗?本质上,域对象只是值对象而所有工作都是在服务层中完成的吗?

任何帮助都会非常感谢。

1 个答案:

答案 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服务,而不是UserServiceLoginService
  • 您拥有Content服务而不是DocumentServiceCommentService以及UserService

哦..而且,您不再需要添加..Service..Controller个后缀。 PHP现在有名称空间。