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

ozxc1zmp  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(152)

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

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

在第二个例子中,我直接从Controller使用了Model函数,但是如果我选择第一个例子更好,我应该创建语言服务,并在语言控制器的索引方法中使用它,即使它非常简单,不需要任何简化,所以你怎么看?

x33g5p2x

x33g5p2x1#

如果你创建了服务,那么我会说它不再是MVC了,因为你有了一个额外的层,我会说正确的方法是在控制器中保存这些行。
例如,Symfony框架不再是MVC,因为创建与数据库通信的服务,然后将它们注入控制器是目前的传统工作方式。
这些服务什么时候可以受益?
假设你有多个控制器,你想共享它们的业务逻辑,那么你只需要创建一个服务,然后将这个服务注入到多个控制器中。
如何使用纯MVC来重用逻辑?
你可以从另一个控制器方法调用控制器方法。
我更喜欢什么?
由于我主要使用Symfony,我真的很喜欢这个额外的服务层,因为

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

相关问题