在鲁门放置业务逻辑?

时间:2016-08-11 20:12:55

标签: php laravel dependency-injection lumen lumen-5.2

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

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

2 个答案:

答案 0 :(得分:4)

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

  

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

     

$instance = app(Something::class);

&#34>解决问题"。注册"事物"是服务提供商的用途。服务提供者只是一个扩展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

答案 1 :(得分:3)

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

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

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

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