1

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

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

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

任何帮助都会非常感谢。

4

1 回答 1

3

看来,您的那部分问题实际上出在映射器中。恕我直言,映射器不应该负责创建域对象。因此,您的示例代码实际上应该更像:

$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对我来说毫无意义。服务应该代表模型层中领域业务逻辑的主要部分。

  • 你有Recognitionservice 而不是UserServiceand LoginService
  • 你有Content服务而不是DocumentServiceand CommentServiceandUserService

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

于 2013-02-17T13:37:00.670 回答