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

Should I use service fore each controller's each function or work with models directly in controller?

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

这是我的授权控制器的注册函数:

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

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

好吧,如果您创建服务 - 那么我会说它不再是 MVC,因为您多了一层。我会说正确的方法是将这些行保存在控制器中。

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

这些服务什么时候有用?

考虑一下您有多个控制器,您希望为其共享业务逻辑。然后您只需创建服务并将此服务注入多个控制器即可。

如何使用纯 MVC 重用逻辑?

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

我喜欢什么?

由于我主要使用 Symfony,所以我非常喜欢这个额外的服务层,因为

  • 代码更加结构化
  • 您可以开始遵循 SOLID 原则
  • 控制器没有任何业务逻辑
  • 控制器只与服务层通信
  • 业务逻辑不再依赖控制器
  • 业务逻辑可以轻松转移到任何 php 框架
  • 您可以在服务中注入服务并以这种方式重用逻辑