2016-08-11 187 views
7

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

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

回答

1

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

3

服务即服务类?服务类不是框架的一部分,它更像是你正在试图解决的应用程序体系结构问题。

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

每个项目都不一样,所以决定在哪里放置服务类以及如何构建应用程序。

记住在整个项目开发周期中坚持一个约定。如果你现在无法想到它,那么稍后在重构会话中构造你的类。当我正在考虑其他事情时,我通常会获得更多的想法,而不是一开始就思考它。