在 Lumen 框架中,业务逻辑应该放在哪里?

8

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

如何在Lumen中实现这个功能?在哪里放置这些服务?我只看到了ServiceProviders注册这些服务,但对于我来说并不清楚在哪里以及如何定义它们。

2个回答

6

服务作为服务类?服务类不是框架的一部分,这更像是您正在尝试解决的应用程序架构问题。

根据您正在开发的项目,可以选择将服务文件夹放在应用程序文件夹中(如果您选择按类型结构的文件夹)或所属功能文件夹中(如果您选择按功能样式的应用程序文件夹)。这只是许多可能的文件夹结构中的两种。

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

请记住,在整个项目开发周期中坚持一种惯例。如果您现在想不出来,请在重构会话中稍后构建您的类。当我在处理其他事情而不是在开始时进行思考时,我通常会有更多想法。


6
Lumen和它的大哥Laravel都带有一个服务容器,用于处理依赖注入。
要从容器中解析出东西,您可以在已由容器自动解析的类(例如路由闭包、控制器构造函数、控制器方法、中间件、事件监听器或排队作业)上输入需要的依赖项。 或者,您可以在应用程序的任何地方使用app函数: $instance = app(Something::class); 这是为了"解析东西"。注册"东西"是服务提供者所用的。服务提供者只是扩展Illuminate\Support\ServiceProvider类并将接口或类绑定到具体实现的类。(阅读文档了解如何编写自己的详细信息。)

例子: 创建一些测试路由:

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

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

public function test(DatabaseManager $dbm)
{
    dd($dbm);
}

你会发现,DatabaseManager接口被解析为具体的类,并正确实例化和配置了你的DB配置。这是因为在某个时候,框架调用了一个服务提供者来处理这个过程。
任何自定义提供者都可以在/bootstrap/app.php中设置,如下所示: $app->register(App\Providers\AuthServiceProvider::class); (否则,如果你请求一个没有被提供者绑定的类,框架就会注入该类的一个新实例。)
所以,针对这个问题,您可能需要一些存储库类,可以封装所有数据库访问。
示例:
// 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,框架会处理两者的实例化。
我希望这能回答你关于在服务提供商中管理业务逻辑的问题。我猜另一个典型用例是授权处理。在这个介绍之后,你可以参考有关此主题的文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接