Lumen 中的业务逻辑应该放在哪里?

Posted

技术标签:

【中文标题】Lumen 中的业务逻辑应该放在哪里?【英文标题】:Where to put business logic in Lumen? 【发布时间】:2016-12-18 17:17:08 【问题描述】:

我正在使用 Lumen 开发我的第一个 API。通常我使用服务将业务逻辑或重用代码从控制器中分离出来,并与其他控制器共享。

如何用流明做到这一点?把服务放在哪里?我只看到 ServiceProviders 来注册这些服务,但对我来说,不清楚在哪里以及如何定义它们。

【问题讨论】:

【参考方案1】:

Lumen 和它的老大哥 Laravel 自带了一个服务容器,用来处理依赖注入。

要解决容器外的问题,您可以在已由容器自动解析的类上键入所需的依赖项,例如路由闭包、控制器构造函数、控制器方法、中间件、事件侦听器、或排队的工作。或者,您可以在应用程序的任何位置使用app 函数:

$instance = app(Something::class);

那是为了“解决问题”。注册“事物”是服务提供商的目的。服务提供者只是一个扩展Illuminate\Support\ServiceProvider 并将接口或类绑定到具体实现的类。 (阅读the docs 了解如何编写自己的代码。)


示例: 创建一些测试路线:

$app->get('/test', 'TestController@test');

并创建控制器方法,类型提示参数:

public function test(DatabaseManager $dbm)

    dd($dbm);

您将看到 DatabaseManager 接口被解析为一个具体的类,正确地实例化并使用您的数据库配置进行配置。那是因为在某些时候框架会调用一个服务提供者来负责这件事。

您可能想要包含的任何自定义提供程序都设置在 /bootstrap/app.php 中,如下所示:

$app->register(App\Providers\AuthServiceProvider::class);

(否则,如果您请求的类尚未被提供者绑定,框架只会注入该类的 new 实例。)


因此,对于这个问题,您可能需要一些可以封装所有数据库访问的存储库类。

例子:

// app/Repositories/ProductRepository.php
private $db;

public function __construct(DatabaseManager $dbm)

    $this->db = $dbm->connection();


public function findById($id)

    return $this->db->table('products')->where('id', '=', $id)->get();


//routes.php
$app->get('products/id', 'ProductsController@show');

//ProductsController.php
public function show(ProductRepository $repo, $id)

    $product = $repo->findById($id);
    dd($product);

在这个示例中有趣的是,您调用 ProductRepository 注入,并且由于它具有 DatabaseManager 依赖项,因此框架会处理两者的实例化。


我希望这可以开始回答您有关在服务提供商中管理业务逻辑的问题。我想另一个典型的用例是授权处理。您可以在此介绍之后关注the docs on this subject。

【讨论】:

【参考方案2】:

服务即服务类?服务类不是框架的一部分,它更像是您试图在这里解决的应用程序架构问题。

根据您正在处理的项目,应用程序文件夹中的服务文件夹(如果您按类型结构查找文件夹)或它所属的功能文件夹(如果您按功能样式查找应用程序文件夹)。这些只是文件夹结构的众多可能方式中的 2 种。

每个项目都不同,因此,您可以决定将服务类放在哪里以及如何构建应用程序。

请记住在整个项目开发周期中遵守一个惯例。如果您现在想不出来,请稍后在重构会话中构建您的类。当我在做其他事情时,我通常会得到更多的想法,而不是在我开始思考它的时候。

【讨论】:

以上是关于Lumen 中的业务逻辑应该放在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

MVC:把业务逻辑放在哪里? [关闭]

MVC 4 - 在哪里保留业务逻辑

使用实体框架时对将业务逻辑放在哪里感到困惑

将两个相关对象的业务逻辑放在哪里?

我在哪里使用 Core Data 将业务逻辑放在 IOS 应用程序中?

在 MVC 架构中将业务逻辑保留在哪里?