我正在用流明开发我的第一个API。通常我使用服务来分离业务逻辑或控制器的重用代码,并与其他控制器共享。Lumen的商业逻辑在哪里?
如何用流明做到这一点?在哪里放置服务?我只看到ServiceProviders注册这些服务,但对我而言,不清楚在哪里以及如何定义它们。
我正在用流明开发我的第一个API。通常我使用服务来分离业务逻辑或控制器的重用代码,并与其他控制器共享。Lumen的商业逻辑在哪里?
如何用流明做到这一点?在哪里放置服务?我只看到ServiceProviders注册这些服务,但对我而言,不清楚在哪里以及如何定义它们。
Lumen和它的大哥Laravel带有一个服务容器,它处理依赖注入。
要解决的东西从容器中,您可以将类型提示你需要对已经自动由容器解决一类,如路线封闭器,控制器构造,控制方法,中间件的依赖,事件监听器或排队作业。或者,你可以在你的应用程序中使用
app
功能从任何地方:
$instance = app(Something::class);
这对“解决的事情了”。注册“事物”是服务提供商的用途。服务提供者只是一个扩展了Illuminate\Support\ServiceProvider
的类,并将接口或类绑定到具体实现。 (阅读the docs关于如何编写自己的一个细节。)
举例: 创建一些测试路线:
$app->get('/test', '[email protected]');
,并创建控制器的方法,类型暗示的参数:
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}', '[email protected]');
//ProductsController.php
public function show(ProductRepository $repo, $id)
{
$product = $repo->findById($id);
dd($product);
}
这是在这个例子中,你要求一个ProductRepository注射有趣,因为它具有的DatabaseManager的依赖,该框架处理两者的实例化。
我希望这会开始回答您关于管理服务提供商业务逻辑的问题。我想另一个典型的用例是授权处理。在此介绍之后,您可以关注the docs on this subject。
服务即服务类?服务类不是框架的一部分,它更像是你正在试图解决的应用程序体系结构问题。
根据您正在处理的项目,应用程序文件夹中的服务文件夹(如果您是按类型结构查找文件夹)或其属于的功能文件夹(如果您按功能样式查找应用程序文件夹) 。这些只是文件夹结构众多可能方式中的两种。
每个项目都不一样,所以决定在哪里放置服务类以及如何构建应用程序。
记住在整个项目开发周期中坚持一个约定。如果你现在无法想到它,那么稍后在重构会话中构造你的类。当我正在考虑其他事情时,我通常会获得更多的想法,而不是一开始就思考它。