[TOC]
## 1、简介
[服务提供者](http://laravelacademy.org/tags/%e6%9c%8d%e5%8a%a1%e6%8f%90%e4%be%9b%e8%80%85 "View all posts in 服务提供者")是所有[Lumen](http://laravelacademy.org/tags/lumen "View all posts in Lumen")应用启动的中心,你自己的应用以及所有Lumen的核心服务都是通过服务提供者启动。
但是,我们所谓的”启动“指的是什么?通常,这意味着[注册](http://laravelacademy.org/tags/%e6%b3%a8%e5%86%8c "View all posts in 注册")事物,包括注册[服务容器](http://laravelacademy.org/tags/%e6%9c%8d%e5%8a%a1%e5%ae%b9%e5%99%a8 "View all posts in 服务容器")绑定、时间监听器、中间件甚至路由。服务提供者是应用配置的中心。
如果你打开Lumen自带的`bootstrap/app.php`文件,将会看到一个`$app->register(`)调用,这里就是应用所要加载的所有服务提供者类。
本章里你将会学习如何编写自己的服务提供者并在Lumen应用中注册它们。
## 2、编写服务提供者
所有的服务提供者继承自`Illuminate\Support\ServiceProvider`类。继承该抽象类要求至少在服务提供者中定义一个方法:`register`。在`register`方法内,你唯一要做的事情就是绑事物到[服务容器](http://laravelacademy.org/post/471.html),不要尝试在其中注册任何时间监听器,路由或者任何其它功能。
#### 2.1 register方法
正如前面所提到的,在`register`方法中只绑定事物到[服务容器](http://laravelacademy.org/post/471.html),而不要做其他事情,否则话,一不小心就能用到一个尚未被加载的服务提供者提供的服务。
现在让我们来看看一个基本的服务提供者长什么样:
~~~
<?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`的实现。如果你不太理解服务容器是怎么工作的,查看其[文档](http://laravelacademy.org/post/471.html)。
#### 2.2 boot方法
如果我们想要在服务提供者中注册视图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()
{
//
}
}
~~~
## 3、注册服务提供者
所有服务提供者都是通过配置文件`bootstrap/app.php`中进行注册,该文件包含了一个`$app->register()`方法调用,你可以将自己自定义的服务提供者放到该方法调用中来注册服务提供者。