我应该为每个控制器的每个功能使用服务还是直接在控制器中使用模型?

问题描述 投票:3回答:1

我有这种情况,我有控制器,例如带有函数寄存器和登录的AuthController,我有一个名为AuthService的服务,这里我实现了我拥有所有类型逻辑和与数据库通信的函数。我在控制器中所做的只是$ auth_service-> register($ request)然后Auth服务完成所有操作,返回响应对象然后在控制器中我将此对象作为Json返回。所以我在控制器中没有雄辩的功能,没有业务逻辑只需3-4行代码。这是一个好习惯吗?例如,如果我只需要Modell:控制器中的all()函数我必须使用服务函数,即使对于那一小段代码,否则我将有结构,我有时使用服务,有时不使用。此外,当我在控制器中注入服务类时,我也会在此服务中注入所有有用的模型(有时是其他服务),如果在一个控制器中有时我使用服务并且有时直接使用模型,那么事实证明我在服务中注入模型在控制器中(注射相同的模型两次)。那么我应该继续这样做并使用服务每个控制器的每个功能吗?我的意思是哪种方式更好,为什么?

这是我的auth控制器的寄存器功能:

protected $auth_service;

    public function __construct(AuthService $auth_service){
        $this->auth_service  = $auth_service;
    }

public function registerUser(UserRegisterRequest $request){
        $registerUser = $this->auth_service->registerUser($request);
        return response()->json($registerUser, 200);
    }

这是语言控制器:

protected $language;

    public function __construct(Language $language){
        $this->language = $language;
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $languages = $this->language->getAllLanguage();
        return response()->json(['data'=>$languages], 200);
    }

在第二个例子中,我直接从控制器使用模型的函数,但如果我选择第一个例子更好,我应该制作语言服务并在语言控制器的索引方法中使用它,即使它非常简单并且不需要任何简化,那么做什么呢您认为?

php laravel web-services service-layer
1个回答
0
投票

好吧,如果你创建服务 - 那么我会说它不再是MVC,因为你有一个额外的层。我会说正确的方法是将这些线保持在控制器中。

例如,Symfony框架不再是MVC,因为创建与数据库通信然后将它们注入控制器的服务是目前传统的工作方式。

这些服务何时可以带来益处?

那么请考虑您有多个控制器,您想要共享业务逻辑。然后,您只需创建服务并在多个控制器中注入此服务。

如何使用纯MVC重用逻辑?

好吧,你可以从另一个控制器方法调用控制器方法。

我更喜欢什么?

由于我主要使用Symfony,我真的很喜欢这个额外的服务层,因为

  • 代码更结构化
  • 您可以开始遵循SOLID原则
  • controller没有任何业务逻辑
  • 控制器仅与服务层通信
  • 业务逻辑不再依赖于控制器
  • 业务逻辑可以很容易地转移到任何PHP框架
  • 您可以在服务中注入服务并以这种方式重用逻辑
© www.soinside.com 2019 - 2024. All rights reserved.