Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 服务层是我所有实际方法的归宿吗?_Php_Oop_Domain Driven Design_Datamapper - Fatal编程技术网

Php 服务层是我所有实际方法的归宿吗?

Php 服务层是我所有实际方法的归宿吗?,php,oop,domain-driven-design,datamapper,Php,Oop,Domain Driven Design,Datamapper,从我读过的所有教程中,服务层似乎只有一个或两个方法,因此我不确定服务是否应该是轻量级/轻量级的,而不是使用您需要的多种方法的fat 如果我有一个Post域对象,并且有一个PostService类,如果你想删除一篇文章,这是你在控制器中要做的吗 $postService = $this->serviceFactory->build('post'); $postService->deletePost($id); post服务中的deletePost()方法类似于: $postMa

从我读过的所有教程中,服务层似乎只有一个或两个方法,因此我不确定服务是否应该是轻量级/轻量级的,而不是使用您需要的多种方法的fat

如果我有一个
Post
域对象,并且有一个
PostService
类,如果你想删除一篇文章,这是你在控制器中要做的吗

$postService = $this->serviceFactory->build('post');
$postService->deletePost($id);
post服务中的
deletePost()
方法类似于:

$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);
对吗?从本质上讲,域对象只是值对象,所有的工作都在服务层中完成吗


任何帮助都会非常感谢。

看起来,你的问题实际上部分在地图绘制程序中。依我看,映射者不应该负责创建域对象。因此,您的示例代码实际上应该更像:

$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) )
{
    ...
}
服务的角色是“应用程序逻辑”,这是一个描述域对象和映射器之间交互的术语。服务与其他服务交互也是很常见的

作为旁注 拥有
邮政服务对我来说毫无意义。服务应该在模型层中表示域业务逻辑的主要部分

  • 您拥有的是
    Recognition
    服务,而不是
    UserService
    LoginService
  • 您有
    内容
    服务,而不是
    文档服务
    评论服务
    用户服务

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

为什么不使用类似ORM的名称空间呢?然后,您的服务层将调用对您的ORM的访问,而不是管理整个流程,因为他是一名开发人员,并且理解ORM的用例非常有限。@tereško ORM不是为开发人员编写的?非常有限的用例?西蒙尼?ZF2与条令2?使用ActiveRecord的Rails?@tereško可以快速开发并避免重复。例如,具有自动将查询结果映射到对象的功能(而不是在任何地方手动映射)。我认为这是一个引起很多主观争论的领域,所以试图将你自己的纯粹主义观点作为“客观事实”来执行可能对作品没有多大好处。所以。。由于您显然不知道ORMs的用例是什么,所以让我向您解释一下。第一组是“蜉蝣计划”(通常作为营销活动的一部分),你写得很快,从不扩展或重温。然后是快速原型设计,当您生成一次性代码时,若概念得到批准,这些代码将在以后被替换。第三组是应用程序,其中域实体只执行基本的CRUD操作,没有域或关系逻辑。那么,这是如何工作的呢?从DO工厂获得一个空的
post
,然后映射器用相关数据填充该对象?它是返回对象,还是将参数作为引用?另外,您如何在此设置中检索多篇文章<代码>$posts=$this->domainObjectFactory->build('postCollection')$POST->SETID($SomeArrayFIDS)$映射器->获取($posts),还是什么?这一切似乎都有点做作和繁琐。不过,我很想听到你详细阐述一下,尽管我知道这可能不是进一步讨论这个问题的合适地点。谢谢。我以前是按你的方式做的,先创建do,然后设置ID,也许我会再做一次。我是在服务层方法中还是在Do方法中执行
$post->allowns..
部分?如果我没有
售后服务
,我是否必须在控制器中执行当前的工作/检查?我想不出这段代码还能到哪里去。@fireyedboy,你可以随时去PHP聊天室。至于您的代码示例,您将“域对象”与“域对象集合”混淆。它们不是一回事。要快速解释,你可以读这篇帖子:@tereško聪明的东西!对我来说已经很清楚了。我喜欢。向上投票:)@David,我想说的是,你不能为一个域对象创建服务。相反,您的服务应该为模型层中功能的不同部分提供抽象边界。至于控制器,控制器中不应该有任何业务逻辑。控制器只接受用户请求,并将数据分发到多个服务,有时分发到视图实例。