php - 什么是存储库、服务和操作/ Controller ?

标签 php design-patterns slim

我利用有限的应用程序架构知识开始了一个使用 Slim3 和 PHP 的项目。计划是创建项目并分离应用程序关注点。一切进展顺利,但随着应用程序的增长,事情变得越来越困惑。

这样做的整个想法是使开发更容易。在某种程度上确实如此,但我发现有时密切关注数据流很复杂。

我需要一些关于什么是存储库、服务和 Controller /操作的建议。以及它们应该如何在系统中工作。我目前对它们的理解如下:

存储库

存储库用于服务层和模型层之间。例如,在 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 文档中使用,似乎代表一个瘦 Controller 。

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
        ]);
    }
}

我是否正确使用这些模式?我似乎采用的流程是这样的:
  • 一切从路线开始。例如,向 /create 发出请求.该路由已注册到 Action。
  • 行动决定调用哪些服务
  • 服务执行逻辑,在需要时调用其他服务和存储库
  • 服务将数据交还给 Action
  • 操作返回响应

  • 任何建议将不胜感激。

    最佳答案

    Am I using these patterns correctly?



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

    您的 UserService似乎处理了太多不同的任务:它处理注册和获取追随者。并且可能会发送短信。提取注册相关逻辑到UserRegistrationService类(class)。

    关于php - 什么是存储库、服务和操作/ Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40911731/

    相关文章:

    angularjs - 具有 slim 框架 api 和 angularjs 的 token 模块

    mysql - 如何对数组中的特定字段进行分组?

    php - 无法在嵌套 foreach 循环中多次循环遍历 mysql 结果

    angularjs - AngularJS 适合 (3) 层架构吗?

    c# - 是否有一种设计模式可以帮助比较大量数据?

    entity-framework - EF 4.2 代码优先和 DDD 设计问题

    php - 在 PHP 中使用 HybridAuth 时如何更新用户状态?

    php - 如何在 Laravel 5 中检索 View 名称?

    php - 来自一个 AJAX 请求的多个响应

    rest - 如何为Slim Framework中内置的REST API编写单元测试?