【问题标题】:Separate Laravel controller for each URL route?为每个 URL 路由单独的 Laravel 控制器?
【发布时间】:2023-04-10 03:34:01
【问题描述】:

我正在构建一个 REST API 服务器(实际上是在 Lumen 中,而不是 Laravel),它具有多个端点,允许对用户、帐户和产品等资源执行各种操作。例如,这里是我为 User 资源定义的路由:

GET /v1.0/user
POST /v1.0/user
GET /v1.0/user/{username}
PUT /v1.0/user/{username}
DELETE /v1.0/user/{username}

我目前在单个控制器中定义了特定资源的所有这些 API 路由。例如,这是我的用户资源路由:

$router->get('/v1.0/user', 'UserController@listAll');
$router->post('/v1.0/user', 'UserController@createUser');
$router->get('/v1.0/user/{username}', 'UserController@getUser');
$router->put('/v1.0/user/{username}', 'UserController@updateUser');
$router->delete('/v1.0/user/{username}', 'UserController@deleteUser');

一些控制器逻辑变得非常复杂,我现在发现我的控制器文件变得非常非常长。我现在想我应该为每个路由使用一个单独的控制器文件,以使代码更易于维护。

我的问题是关于文件/文件夹命名或结构,我是否应该遵循任何习惯用法或约定。我是否应该在 Controllers 下为每个资源创建一个子文件夹(例如:Controllers/User/UserCreateController.php)?还是这完全是个人选择的问题?

【问题讨论】:

  • 你在你的控制器方法中做了什么,这使它变得复杂,你不需要验证,查询就像你控制器中的东西。

标签: laravel lumen


【解决方案1】:

您应该查看Single Action Controller,它只采用__invoke() 方法并且可以处理一个单一的路线。

顺便说一句,我通常看到的是,当控制器逻辑变得复杂时,是时候重构并将复杂性移到控制器之外了。

【讨论】:

    【解决方案2】:

    您不需要创建子文件夹或多个控制器。使用一个控制器用户控制器,它只包含每个路由的入口点。通过创建一个或一组负责处理流程的类,将业务逻辑移到控制器之外。

    例如:您可以在app文件夹下创建另一个目录Libraries,并在Libraries下创建一个包含User资源所有功能的类User

    app/Libraries/User.php

    namespace App\Libraries;
    
    class User {}
    

    现在,您可以使用用户控制器中的命名空间访问此类和函数

    namespace App\Http\Controllers;
    
    use App\Libraries\User;
    
    class UserController extends Controller {}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-13
      • 2016-08-09
      • 2018-09-14
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 2017-05-01
      相关资源
      最近更新 更多