【问题标题】:What are Repositories, Services, and Actions/Controllers?什么是存储库、服务和操作/控制器?
【发布时间】:2016-12-01 22:30:58
【问题描述】:

我使用 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. 操作返回响应

任何建议将不胜感激。

【问题讨论】:

  • 我看到收盘被认为过于宽泛。我不同意。使用这种设计模式设计应用程序通常只有一个正确答案。例如,您不会使用存储库中的服务,这是一种不好的做法。由于潜在的知识差距,我很可能会做一些被认为是不良做法的事情,这就是我问的原因。
  • 您所做的一切都很好 - 这就是您要寻找的答案吗? )
  • @GeorgyIvanov 由于我的知识有限,其中大部分是基于猜测或常识,我假设在某个地方我做错了,因为我仍然面临一些复杂性,同时管理项目。

标签: php design-patterns slim


【解决方案1】:

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

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

您的UserService 似乎处理了太多不同的任务:它处理注册并吸引关注者。并且可能发送短信。将注册相关的逻辑提取到UserRegistrationService类中。

【讨论】:

  • 啊,关于 SRP 的非常好的建议。在决定“哪里是最好的去处”时,我经常陷入困境。结果,我的课程做得太多了。一般来说,当您遵循 SRP 时,会显着增加应用程序中的类数量吗?
  • @BugHunterUK,是的,但这不正是您要做的吗?将“大神”类分解为“小重点”类。 ) 至于“太多的类”——你不太可能遇到这样的问题,只要你的代码有逻辑组织。
【解决方案2】:

如果你对应用程序架构了解有限,我建议你先阅读这本关于设计模式的书:http://amzn.eu/aNVH8Ii

第二点是不要使用slim框架。对于已经知道自己想要构建什么以及如何构建的人来说,这是一个小型框架。绝对不是学习任何模式或应用程序架构的框架。

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

Yii 使用了当今大型应用程序中常用的大多数设计模式和架构解决方案,并且易于学习和理解。

【讨论】:

  • Slim 是学习模式的优秀框架,因为它迫使您实际创建应用程序的架构。 Yii 是架构最佳实践的禁忌。
  • 为什么不呢?正如我所说,这些是建议。对我来说,通过查看一个大框架更容易理解模式,因为你会看到它们是如何在生产中使用的,而不是在纸上。没有实践的理论没有多大帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 2023-04-01
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
相关资源
最近更新 更多