用于复杂页面的Laravel控制器


Laravel controllers for complex pages

我开始了一个新的laravel网站项目,我在理解MVC方面遇到了障碍。我需要重构才能继续,但我不知道最好的方法。

目前,我有一些网页可以显示单个逻辑的结果。例如,一个列出所有用户的页面,一个只列出一个用户的详细信息的页面等等——所有这些都由userController处理。这适用于其他控制器正在处理的其他页面。

我已经创建了与数据库中的表直接相关的模型,以及与模型相关的控制器。我将业务逻辑从控制器转移到了服务。控制器使用服务来执行业务逻辑,并使用返回的数据将数据传递给视图。

这很好地将类似的功能组合在一起,并且工作良好。

userTable   -> userModel   -> userController   -> userService
clientTable -> clientModel -> clientController -> clientService
...

在我的路由中,我有一些页面使用相同的相应控制器来执行相关功能,但单独的方法取决于页面所做的

/listallusers          -> userController@list     -> userList.blade.php
/listallclients        -> clientContoller@list    -> clientList.blade.php
/listdetailofoneclient -> clientContoller@details -> clientDetails.blade.php

当处理具有该功能的页面时,这是可以的,并且(除了使用服务)似乎是laravel文档中暗示的。

然而,当处理那些没有真正使用任何服务的功能的页面,或者严重需要多个服务的功能(并且数据需要复杂的操作,如格式化等)的页面时,我开始对控制器感到困惑。

  1. 基本索引页

什么控制器可以处理这个问题?索引可能链接到由现有控制器处理的路由,但除此之外,它可能不需要显示太多功能。这意味着控制器不需要向视图传递太多复杂的数据(如果有的话)。可以将逻辑粘贴到路由文件中以返回视图,但这是非常紧密耦合的。

  1. 显示复杂客户端用户数据的页面

您需要将客户端数据用户数据从控制器传递到视图。但来自哪个控制器?这是真正阻碍我前进的部分。

因为我的页面数量有限,但每页都有很多逻辑显示,所以我想制作一个page controller(或其他什么)来处理路由。虽然我看过,但我在任何地方都没有看到任何真正提到这个想法,这让我觉得我要么在重新发明轮子,要么没有掌握laravel/MVC中的一些基本概念。

在这种情况下,页面控制器会处理所有路由吗?它会只处理具有"重叠"现有控制器功能的页面和不属于现有控制器的页面吗?页面控制器是个好主意吗?

更多的一些观点让我从这个问题中质疑MVC

  • 控制器需要一个等效的模型吗
  • 控制器是否可以"控制"其他控制器以分离逻辑

我将尝试回答其中的几个问题。

  1. 具有PageControllerHomeController是非常可接受的。控制器不必链接到特定的模型,例如AuthController将处理登录和注销的逻辑,但不绑定到模型,或者PasswordController处理设置/重置密码,或者PaymentController处理计费路由。控制器只是在一个文件中组织相关路由的逻辑的一种方式。静态基本页面是相关的路由,所以PageController对我来说很有意义

  2. 用户是否与特定客户端绑定?如果是这样的话,你可以以嵌套的方式排列控制器,这样你就有了ClientControllerUserController,你的路线看起来像这样:

    /clients/{client}/users   //list all users for this client
    
  3. 对于重数据格式化,最好使用服务提供程序,并使用依赖项注入将其注入需要使用的控制器。这允许您将数据操作与控制器分离,以便在需要时进行更改。假设你正在使用一个软件制作图表,并且你想稍后更改它——你想从控制器中删除格式化逻辑。

我希望我在某种程度上有所帮助。。。这里有点思路!