基本提供者例子
所有的服务提供者都应继承 Illuminate\Support\ServiceProvider 此一类。在这个抽象类中,至少必须定义一个方法: register 。在 register 方法中,应该只绑定服务到服务容器之中。你永远不该试图在 register 方法中注册任何事件监听器、路由或任何其他功能。
Artisan 命令行接口可以很容易地通过 make:provider 产生新的提供者:
php artisan make:provider RiakServiceProvider
注册者方法
现在,让我们来看看基本的服务提供者:
<?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($app['config']['riak']);
});
}
}
这个服务提供者只定义了一个 register 方法,并在服务容器中使用此方法定义了一份 Riak\Contracts\Connection 的实现。若你还不了解服务容器是如何运作的,不用担心,我们很快会提到它。
此类位于 App\Providers 命名空间之下,因为这是 Laravel 中默认服务提供者所在的位置。然而,你可以随自己的需要改变它。你的服务提供者可被置于任何 Composer 能自动加载的位置。
启动方法
所以,若我们需要在服务提供者中注册一个事件监听器,该怎么做?它应该在 boot 方法中完成。这个方法会在所有的服务提供者注册后才被调用,这能让你使用框架中其他所有已注册过的服务。
<?php namespace App\Providers;
use Event;
use Illuminate\Support\ServiceProvider;
class EventServiceProvider extends ServiceProvider {
/**
* 执行注册后的启动服务。
*
* @return void
*/
public function boot()
{
Event::listen('SomeEvent', 'SomeEventHandler');
}
/**
* 在容器中注册绑定。
*
* @return void
*/
public function register()
{
//
}
}
我们可以对 boot 方法中的依赖作类型提示。服务容器会自动注入任何你所需要的依赖:
use Illuminate\Contracts\Events\Dispatcher;
public function boot(Dispatcher $events)
{
$events->listen('SomeEvent', 'SomeEventHandler');
}