为每个 URL 路由单独的 Laravel 控制器?

Posted

技术标签:

【中文标题】为每个 URL 路由单独的 Laravel 控制器?【英文标题】:Separate Laravel controller for each URL route? 【发布时间】:2019-10-03 23:24:05 【问题描述】:

我正在构建一个 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)?还是这完全是个人选择的问题?

【问题讨论】:

你在你的控制器方法中做了什么,这使它变得复杂,你不需要验证,查询就像你控制器中的东西。 【参考方案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 

【讨论】:

以上是关于为每个 URL 路由单独的 Laravel 控制器?的主要内容,如果未能解决你的问题,请参考以下文章

带有 POST 请求的 Laravel 路由 URL 参数

Laravel:如何在路由中传递单个 ID

Laravel 将 url 参数从控制器传递到路由

laravel 将未定义的 url 路由到特定的控制器

在 Laravel 5.2 中将页面 URL 参数传递给控制器

在 Laravel 中为资源控制器添加新方法