laravel service provider——迹忆客-ag捕鱼王app官网
介绍
service provider是整个laravel应用程序引导的中心。我们自己的应用程序以及laravel的所有核心服务都通过service provider来引导。
但是,“引导”是什么意思?通常,我们的意思是注册内容,包括注册服务容器绑定,event listener,中间件,甚至路由。service provider是配置我们的应用程序的核心。
如果打开config/app.php
的文件,则会看到一个providers数组。这些都是为我们的应用程序加载的所有service provider类。请注意,其中许多是“deferred”的providers,这意味着它们不会在每个请求上都加载,而仅在实际需要它们提供的服务时才加载。
在本节内容中,我们将学习如何编写自己的service provider并将其注册到laravel应用程序中。
编写service provider
所有service provider都继承自illuminate\support\serviceprovider
类。大多数service provider都包含register
和boot
两个方法。在register
方法内,我们应仅将类绑定到服务容器中。绝对不要尝试在该register方法中注册任何事件监听器,路由或任何其他功能。
artisan cli可以通过make:provider
命令生成新的 provider:
$ php artisan make:provider riakserviceprovider
register 方法
如前所述,在register
方法内,绝对不要尝试在该register方法中注册任何事件监听器,路由或任何其他功能。否则,可能会意外使用尚未加载的service provider提供的服务。
让我们看一下基本的service provider。在任何service provider的方法中,我们始终可以访问$app
属性,该属性提供对服务容器的访问:
app->singleton(connection::class, function ($app) {
return new connection(config('riak'));
});
}
}
上面示例中的service provider仅定义一个register
方法,并使用该方法定义riak\connection
的实现,并将二者在服务容器中进行绑定。如果不了解服务容器的工作原理,请查看 service container文档。
bindings
与singletons
属性
如果service provider注册了许多简单的绑定,则我们可能希望使用bindings
和singletons
属性,而不是手动注册对每个类在容器中进行绑定。框架加载service provider后,它将自动检查以下属性并注册其绑定:
digitaloceanserverprovider::class,
];
/**
* all of the container singletons that should be registered.
*
* @var array
*/
public $singletons = [
downtimenotifier::class => pingdomdowntimenotifier::class,
serverprovider::class => servertoolsprovider::class,
];
}
boot 方法
如果我们需要在我们的service provider中注册view composer该怎么办?这应该在boot方法内完成。在注册了所有其他service provider之后,将调用boot方法,这意味着我们可以访问框架已注册的所有其他服务:
composer('view', function () {
//
});
}
}
boot 方法依赖注入
您可以在service provider的boot方法中键入类型提示。服务容器将自动注入你需要的任何依赖关系:
use illuminate\contracts\routing\responsefactory;
public function boot(responsefactory $response)
{
$response->macro('caps', function ($value) {
//
});
}
注册 providers
所有service provider都需要在config/app.php
配置文件中注册。该文件包含一个providers
数组,我们可以在其中列出service provider的类名。默认情况下,此数组中列出了一组laravel自带的核心service provider。这些provider程序是laravel的核心组件,例如邮件程序,队列,缓存和其他组件。
要注册我们自己的的provider程序,需要将其添加到数组中:
'providers' => [
// other service providers
app\providers\composerserviceprovider::class,
],
延时 provider
如果我们的 provider 仅在服务容器中注册绑定,则可以选择将其注册为一个延迟的provider,只有在实际需要的时候菜进行绑定。延迟此类 provider 程序的加载可以提高应用程序的性能,因为并不是在每次请求时都需要从文件系统中加载该 provider 程序。
laravel编译并存储由延迟 service provider 提供的所有服务的列表,以及其 service provider 类的名称。然后,只有当我们尝试解析这些服务时,laravel才会加载服务service provider
要延迟 provider 的加载,需要实现\illuminate\contracts\support\deferrableprovider
接口并定义provides
方法。provides
方法应该返回由 provider 注册的服务容器绑定:
app->singleton(connection::class, function ($app) {
return new connection($app['config']['riak']);
});
}
/**
* get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return [connection::class];
}
}