前言上一篇博文收集了Laravel服务容器的相关知识(传送门)。我们知道,服务容器主要有两个重要的功能:绑定和解析。那么Laravel的框架集有这么多的功能,我们的项目可能需要引入一些额外的功能包。这些绑定必须有统一的管理工具,绑定在一个地方,就是服务提供者。关于服务提供者刚开始学习Laravel时,我对服务容器和服务提供者的名字感到困惑。其实我是这样理解的:容器就是一个底下的大桶,我们需要很多材料来装它,provider就是一些管道。我们只是把我们需要的东西,我们需要的服务,通过提供者塞进容器里。Laravel有一种机制来定义和执行每个服务的初始处理。实现初始处理的类称为服务提供者。服务提供者,在laravel中,其实就是一个工厂类。它最大的功能就是进行服务绑定。当我们需要绑定一个或多个服务时,我们可以自定义一个服务提供者,然后将服务绑定的逻辑放在这个类的实现中。在larave中,自定义一个服务提供者非常容易,只需要继承IlluminateSupportServiceProvider类即可。下面是一个简单的自定义服务提供者来说明服务提供者的一些要点:publicfunctionboot(){//}publicfunctionregister(){$this->app->singleton('service1',function(){return'service1';});$this->app->singleton('service2',function(){return'service2';});$this->app->singleton('service3',function(){return'service3';});}publicfunctionprovides(){return['service1','service2','service3'];}}服务提供者类可以通过artisan命令创建:artisanmake:provideryourServiceProvider创建的文件会存放在appProviders目录下现在我们的服务已经在yourServiceProvider绑定的类register()中实现了。虽然服务提供者的创建和绑定已经完成,但是框架并不知道多了一个服务提供者,所以程序运行过程中不会调用这个类中的register()方法,所以需要在某处完成注册告诉框架关于新创建的服务提供者--配置文件config/app.php'providers'=>[/**LaravelFrameworkServiceProviders...*/Illuminate\Auth\AuthServiceProvider::class,Illuminate\广播\BroadcastServiceProvider::class,Illuminate\Bus\BusServiceProvider::class,Illuminate\Cache\CacheServiceProvider::class,Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,.........App\Providers\AppServiceProvider::class,App\Providers\AuthServiceProvider::class,//App\Providers\BroadcastServiceProvider::class,App\Providers\EventServiceProvider::class,App\Providers\RouteServiceProvider::class,]],laravel找到服务时供应商课后,初始化服务提供者类,得到一个服务提供者对象,调用其注册方法。自然而然,其中的所有服务绑定代码都会被执行:publicfunctionregisterConfiguredProviders(){$manifestPath=$this->getCachedServicesPath();(newProviderRepository($this,newFilesystem,$manifestPath))->load($this->config['app.providers']);}laravel会注册所有自定义的服务提供者进入这个注册的过程其实就是实例化上面提到的服务提供者的类并调用register方法的过程。除了register方法,serviceprovider中还有一个boot方法。这个boot方法会在所有服务提供者注册完成后执行,所以当服务绑定完成后,你想通过容器解析出其他服务,做一些初始化工作的时候,那么这些逻辑就可以写在boot方法中。因为在执行boot方法的时候已经注册了所有的服务提供者,所以可以保证在boot方法中可以解析到其他的服务。以上主要介绍了laravel服务提供者的功能和具体使用方法。在我们平时的开发中,引入第三方包就是这样一个步骤(例如overtrue/laravel-wechat):安装介绍:composerrequire"overtrue/laravel-wechat:~4.0"在config/app中注册ServiceProvider和Facade。php(Laravel5.5不需要手动注册)'providers'=>[//...Overtrue\LaravelWeChat\ServiceProvider::class,],'aliases'=>[//...'EasyWeChat'=>Overtrue\LaravelWeChat\Facade::class,],创建配置文件artisanvendor:publish--provider="Overtrue\LaravelWeChat\ServiceProvider服务提供者还有一个小问题值得关注,由于php是一门基础语言,所有的php都会被执行处理请求时从入口文件中获取。出于性能的考虑,laravel在第一次初始化的时候会将所有的服务提供者缓存在bootstrap/cache/services.php文件中,所以有时候当你更改某个服务提供者的代码时,刷新它可能看不到预期的效果,这可能是由缓存引起的。这个时候把services.php删掉就可以看到你想要的效果了。再次感谢诸葛云的这篇文章。阅读后,您将收到大量商品。本文内容比较粗糙。如果你想了解更多,可以在这里阅读laravel框架容器管理的一些要点。
