在鲁门放置业务逻辑?

rak*_*ete 8 php dependency-injection laravel lumen lumen-5.2

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

用流明怎么做?在哪里提供服务?我只看到ServiceProviders注册这些服务,但对我来说,目前尚不清楚在何处以及如何定义它们.

ale*_*ino 6

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

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

$instance = app(Something::class);

那是为了“解决问题”。注册“事物”是服务提供者的目的。服务提供者只是一个Illuminate\Support\ServiceProvider将接口或类扩展并绑定到具体实现的类。(有关如何编写自己的文档的详细信息,请阅读文档。)


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

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

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

public function test(DatabaseManager $dbm)
{
    dd($dbm);
}
Run Code Online (Sandbox Code Playgroud)

您将看到 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();
}
Run Code Online (Sandbox Code Playgroud)
//routes.php
$app->get('products/{id}', 'ProductsController@show');
Run Code Online (Sandbox Code Playgroud)
//ProductsController.php
public function show(ProductRepository $repo, $id)
{
    $product = $repo->findById($id);
    dd($product);
}
Run Code Online (Sandbox Code Playgroud)

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


我希望这开始回答您关于在服务提供者中管理业务逻辑的问题。我想另一个典型的用例是授权处理。在此介绍之后,您可以遵循 有关此主题的文档


Ruf*_*les 5

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

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

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

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