2

我需要一些帮助来理解每个在大型应用程序中扮演的角色。我将首先从一个场景开始:

  • 像往常一样会有用户
  • 用户必须具有 MembershipType(免费、基本、商业)。
  • 用户可以拥有(不是必需的)企业(用户拥有一个或零个企业)
  • 一个用户可以有一个订阅(用户有一个或零个订阅)。
  • 订阅需要与 MembershipType 相关的 SubscriptionPlan。因此,“基本”会员类型在 Stripe 中将具有“基本 2015”计划;一个“企业”将有一个“business2015”计划。
  • 一个用户有地址(用户多对多地址)
  • 基本用户必须有“个人”地址存档,而商业用户必须有“公司”地址存档
  • 还有其他要求,但这足以获得更好的画面

到目前为止,我有这些模型:用户、会员类型、业务、订阅、订阅计划和地址。

一些业务逻辑要求我至少有以下方法: - 用户 isBusiness() - 用户 hasAddress(type) 其中类型是(个人或企业) - 会员类型 getPlanForCurrentYear()
- 需要其他东西,但我会在这里停止

现在举个例子:John 注册并需要提供基本信息(电子邮件、密码、姓名)。他注册为企业。在这个基本的注册过程之后,他会登录并通知他需要在获得访问权限之前完成他们的个人资料。然后要求他提供商业信息(姓名、网站、电子邮件、电话)。我还需要营业地址。然后,他必须订阅当前年度计划“business2015”。

所有这些我都设法做到了,但我是在我的控制器中做到的。正如其他帖子中的一些建议,首先使其工作,然后决定是否需要将其提取到存储库。好吧,我已经到了确定我需要使用存储库的地步,因为它变得越来越复杂,我必须不断地修改我的控制器。因此,经过大量研究后,我仍然对如何使我的 DB 到 UI 的双向工作没有混乱。

我的研究使我意识到我需要使用存储库,也许是服务类和作业。有人可以分享一些关于我需要什么才能拥有一个好的架构的想法吗?

  1. 每个模型都需要一个存储库吗?拥有一个带有通用方法(all、getId、create、update、delete 等)的接口和抽象存储库。如果是这样,我将如何在它们之间关联存储库?

  2. 我是否需要在特定时间编排所有涉及的存储库的服务类(如 RegisterUser、CompleteProfile)?

  3. 在这种情况下我应该如何使用 Jobs?从控制器调度它们并注入存储库或服务类?

  4. Laravel(开源)中是否有大型应用程序的示例,我可以看一下以了解所涉及的一些原则?

谢谢你。

4

1 回答 1

1

1 & 2. 目前,您正在通过控制器中的模型查询数据库。首先在控制器之外编写一个中间层。这可以称为服务层。所以让我们假设一个用户想要注册,并发布到你的控制器的 store 方法。

创建一个UserService并添加一个方法register。让您的服务与模型对话。并且您的控制器与服务交谈。

UserController extends BaseController {

    // Dependency injected the UserService
    public function __construct(UserService $userService) {
        $this->userService = $userService;
    }
    public function store(){
        // validate input

        // register the user
        if (!$this->userService->register($input)) {
            // return error
        }
        // return success
    }
}

class UserService {
    protected $user;

    // Dependency injected the User model.
    public function __construct(User $user) {
         $this->user = $user;
    }

    public function register($input) {
         return $this->user->create($input);
    }
}

一旦掌握了这一点,您就可以考虑接口并抽象出进一步的层。

暂时忘记接口——你可能还不需要它们。当您可以进一步换出实现时,接口非常好。例如,现在您正在使用 Stripe Billing,但有一天您可能希望使用 Paypal,因此您将支付系统编程为一个接口,该接口基本上是一份合同,明确规定了需要公开的公共方法。

  1. 你还不需要工作。

  2. 根据我之前的评论,www.laracasts.com 是一个非常好的资源。

一旦你掌握了从控制器中抽象出细节的窍门,剩下的就应该自然而然地及时出现。

于 2015-10-06T19:31:10.640 回答