gpt4 book ai didi

php - 业务逻辑放在 Lumen 哪里?

转载 作者:可可西里 更新时间:2023-11-01 12:35:23 26 4
gpt4 key购买 nike

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

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

最佳答案

Lumen 和它的老大哥 Laravel 带有一个服务容器,它处理依赖项注入(inject)。

To resolve things out of the container, you may either type-hint the dependency you need on a class that is already automatically resolved by the container, such as a route Closure, controller constructor, controller method, middleware, event listener, or queued job. Or, you may use the app function from anywhere in your application:

$instance = app(Something::class);

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


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

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

并创建 Controller 方法,类型提示参数:

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

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

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

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

(否则,如果您请求一个未被提供者绑定(bind)的类,框架只会注入(inject)该类的一个 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 注入(inject),并且由于它具有 DatabaseManager 依赖项,因此框架会处理两者的实例化。


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

关于php - 业务逻辑放在 Lumen 哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38905298/

26 4 0