每个网址路由都需要单独的Laravel控制器?

时间:2019-05-16 16:11:26

标签: laravel lumen

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

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

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

$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 / User / UserCreateController.php)?还是这完全是个人选择的问题?

2 个答案:

答案 0 :(得分:1)

您应该检出Single Action Controller,该方法仅采用__invoke()方法并且可以处理一条路线。

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

答案 1 :(得分:0)

您不需要创建子文件夹或多个控制器。使用单个控制器用户控制器,该控制器仅包含每个路线的入口点。通过创建负责该过程的一个类或一组类,将业务逻辑移出控制器。

例如:您可以在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 {}