在 Lumen/Laravel 控制器中添加自定义逻辑的最佳实践

Posted

技术标签:

【中文标题】在 Lumen/Laravel 控制器中添加自定义逻辑的最佳实践【英文标题】:Best practice for adding custom logic in Lumen/Laravel controller 【发布时间】:2018-05-12 20:29:54 【问题描述】:

我正在使用 Lumen (Laravel) 为在线活动/活动应用程序创建一个 API,该应用程序处理各种活动的现场注册和礼品兑换等事情。有时,某些具有非常特定功能的事件需要它们自己的自定义逻辑。我想知道如何从架构/最佳实践的角度最好地处理此自定义代码。

这就是我所拥有的:我有一条像这样调用 CustomCampaignController 的路由:

$router->group([
    'prefix' => 'v1'
], function () use ($router) 
    // ..... other routes for standard activities
    $router->post('customCampaigns', 'CustomCampaignController@runController');
);

在 App\Http\Controllers 下,我打开了一个目录来存储所有自定义活动的类。 customCampaigns 路由采用 activityId 参数,其值与活动类之一匹配。例如,如果客户端将 activityId="MyCustomActivity" 发布到 customCampaigns,我将实例化以下类:App\Http\Controllers\Custom\MyExampleActivity。

// app/Http/Controllers/CampaignController.php
public function runController(Request $request) 
    $className = 'App\\Http\\Controllers\\Custom\\' . $request->input('activityId');
    $customController = new $className;
    return $customController->run();

然后自定义控制器会做它的事情并返回响应

// app/Http/Controllers/Custom/MyCustomActivity.php
namespace App\Http\Controllers\Custom;

class MyCustomActivity

    public function __construct()
    
        //
    

    public function run()
    
        // Custom logic here
        return response('Response');
    

这是一种好方法还是可以被视为反模式?如果此类问题有其他模式,请告诉我。

【问题讨论】:

【参考方案1】:

我更愿意将自定义活动作为 url 的一部分。所以,你会有这样的东西

$router->group([
  'namespace' => 'App\Http\Controllers\Custom',
  'prefix' => 'v1/customCampaigns'
], function () use ($router) 
  $router->post('myCustomActivity', 'MyCustomActivityController@methodName');
);

使用这种格式,您可以将端点直接映射到特定的控制器中。

【讨论】:

问题是可能有很多自定义活动。我想问题是,最好是有多条路线,每条路线处理一个活动,还是一条路线来处理许多活动?使用单一路线,我不需要为每个新活动不断更新 route.php 文件。

以上是关于在 Lumen/Laravel 控制器中添加自定义逻辑的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

Lumen:将中间件添加到打包定义的路由中

关于Lumen / Laravel .env 文件中的环境变量是如何生效的

Lumen (Laravel) Eloquent php artisan make:model 未定义

在 Lumen (Laravel) 中启用中间件

如何解决 Lumen/Laravel 中的单例?

Lumen/laravel Event Demo