我正在构建一个具有多个端点的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)?还是这完全是个人选择的问题?
答案 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 {}