2016-12-01 80 views
0

我使用Slim3和PHP开始了一个使用有限的应用程序体系结构知识的项目。该计划是为了创建项目和单独的应用程序问题。这一切进展顺利,但随着应用程序的增长,事情变得非常混乱。什么是存储库,服务和操作/控制器?

这样做的整个想法是为了使开发更容易。它在某种程度上可以做到,但我发现有时候需要密切关注数据流。

我需要一些关于仓库,服务和控制器/操作的建议。以及他们应该如何在系统中工作。我目前的了解它们是下面:

库是服务层和模型层之间使用。例如,在UserRepository中,您将创建包含从数据库读取/写入的代码的方法。在PHP中,在repo方法中将使用PDO或ORM。例如:

class UserRepository 
{ 
    public function findByID($id) { ... } 
    public function findByEmail($email) { ... } 
    public function findByMobile($mobile) { ... } 
    public function createEmail($email, $firstname, $lastname, $password) { ... } 
    public function createMobile($mobile, $firstname, $lastname, $password) { ... } 
} 

我已经提出了一些示例方法。但可能会有更多。

服务

服务层封装应用程序逻辑。例如,UserService将负责创建帐户,并执行所需的逻辑以注册用户。服务也可以是第三方,例如为Facebook的SDK或ORM创建服务。

一个例子服务:

class UserService 
{ 
    public function createMobile($mobile, $firstname, $lastname, $password)  { 
    /* 
    * Call a validation service to validate input 
    */ 
    ... 

    /* 
    * Use UserRepository's findByMobile() to check if account exists 
    */ 
    ... 

    /* 
    * Use UserRepository's createMobile() to create account 
    */ 
    ... 

    /* 
    * Call SMS service to send verification code 
    */ 
    ... 
    } 

    public function createEmail(...) { ... } 
    public function getFollowers (...) { ... } 
} 

操作

我不知道这是否是一个真正的术语。它在Slim Framework文档中使用,似乎代表了一个瘦控制器。

一个Action包含非常少的逻辑,用于调用服务。除非有正当的理由,否则Action很少会直接调用存储库。 Action将对从服务返回的数据执行基本检查,以便将响应发送回客户端。

他们绑定到个人路线。我正在使用它们:

class ActivateEmailAction extends Action { 

    public function __invoke(Request $request, Response $response, $args = []) 
    { 
     if(!$this->ci->ActivationService->activateEmail($args['token'])){ 
      return $response->withJson([ 
       'status' => 'error', 
       'data' => null, 
       'message' => 'Invalid verification token' 
      ]); 
     }; 

     return $response->withJson([ 
      'status' => 'success', 
      'data' => null, 
      'message' => null 
     ]); 
    } 
} 

我是否正确使用这些模式?我似乎采取的流程是这样的:

  1. 一切都从路线开始。例如,请求/create。路由被注册到一个Action。
  2. 行动决定调用何种服务
  3. 服务执行逻辑,使其他服务和存储库调用如果需要
  4. 服务手回数据
  5. 行动返回响应行动

任何建议将不胜感激。

+0

我看到关闭已被选为过于宽泛。我不同意。使用这种设计模式设计应用程序通常只有一个正确答案。例如,你不会使用存储库中的服务,这是不好的做法。由于知识的潜在差距,我很可能会做一些被认为是不好的做法,这就是我问过的原因。 – BugHunterUK

+0

你所做的一切都很好 - 是你寻找的答案吗? ) –

+0

@GeorgyIvanov我的知识受到限制,其中很大一部分是基于猜测或常识,我认为在某些地方我做得不正确,因为我在管理项目时仍然面临一些复杂性。 – BugHunterUK

回答

2

我是否正确使用这些模式?

是的,你是。我所给出的一般建议是不要给你的班级和服务特别是太多的责任:遵循单一责任原则,基本上规定“我的班级应该只有一个改变的理由”(即M.Fowler的)据我记得实际上是R. Martin,这要感谢Gordon在评论中的更正)。

您的UserService似乎正在处理太多不同的任务:它处理注册并抓住追随者。并可能发送短信。将注册相关逻辑提取到UserRegistrationService类中。

+0

啊,非常好的SRP建议。在决定“去哪里最好的地方”时,我常常陷入困境。因此,我得到的课程太多了。一般来说,当你遵循SRP时,会大大增加应用程序中的类数量? – BugHunterUK

+0

@BugHunterUK,是的,但是这不正是你要做的吗?打破“大神”类到“较小焦点”类。 )至于“太多类” - 只要你的代码是按逻辑组织的,你不可能遇到这样的问题。 –

-3

如果你的应用程序架构的知识有限,我建议你阅读这本书的设计模式第一:http://amzn.eu/aNVH8Ii

第二点是不使用苗条的框架。对于那些已经知道他们想要构建什么以及如何去做的人来说,这是一个小框架。绝对不是学习任何模式或应用程序体系结构的框架。

我建议看看的Yii 2:http://www.yiiframework.com/doc-2.0/guide-index.html

Yii中使用了大部分的设计模式和架构解决方案,它们通常在大型应用的今天,并且易于学习和理解。

+1

Slim是学习模式的极好框架,因为它迫使您真正创建应用程序的体系结构。 Yii是一个不可或缺的最佳实践。 –

+0

为什么不呢?正如我所说,这些建议。对我来说,通过在一个大框架内查看,可以更容易地理解模式,因为您可以看到它们在生产中的使用方式,而不是在纸上。没有实践的理论不是很有帮助。 –

相关问题