服务提供者是所有Lumen应用启动的中心,你自己的应用以及所有Lumen的核心服务都是通过服务提供者启动。
但是,我们所谓的”启动“指的是什么?通常,这意味着注册事物,包括注册服务容器绑定、时间监听器、中间件甚至路由。服务提供者是应用配置的中心。
如果你打开Lumen自带的bootstrap/app.php
文件,将会看到一个$app->register(
)调用,这里就是应用所要加载的所有服务提供者类。
本章里你将会学习如何编写自己的服务提供者并在Lumen应用中注册它们。
所有的服务提供者继承自Illuminate\Support\ServiceProvider
类。继承该抽象类要求至少在服务提供者中定义一个方法:register
。在register
方法内,你唯一要做的事情就是绑事物到服务容器,不要尝试在其中注册任何时间监听器,路由或者任何其它功能。
正如前面所提到的,在register
方法中只绑定事物到服务容器,而不要做其他事情,否则话,一不小心就能用到一个尚未被加载的服务提供者提供的服务。
现在让我们来看看一个基本的服务提供者长什么样:
<?php
namespace App\Providers;
use Riak\Connection;
use Illuminate\Support\ServiceProvider;
class RiakServiceProvider extends ServiceProvider{
/**
* 在容器中注册绑定.
*
* @return void
*/
public function register()
{
$this->app->singleton('Riak\Contracts\Connection', function ($app) {
return new Connection(config('riak'));
});
}
}
该服务提供者只定义了一个register
方法,并使用该方法在服务容器中定义了一个Riak\Contracts\Connection
的实现。如果你不太理解服务容器是怎么工作的,查看其文档。
如果我们想要在服务提供者中注册视图composer该怎么做?这就要用到boot
方法了。该方法在所有服务提供者被注册以后才会被调用,这就是说我们可以在其中访问框架已注册的所有其它服务:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class EventServiceProvider extends ServiceProvider{
/**
* Perform post-registration booting of services.
*
* @return void
*/
public function boot()
{
view()->composer('view', function () {
//
});
}
/**
* 在容器中注册绑定.
*
* @return void
*/
public function register()
{
//
}
}
所有服务提供者都是通过配置文件bootstrap/app.php
中进行注册,该文件包含了一个$app->register()
方法调用,你可以将自己自定义的服务提供者放到该方法调用中来注册服务提供者。