🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
所有的服务提供者都应继承 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'); } ~~~