服务提供者是所有Laravel应用程序的引导中心,应用程序,以及通过服务器引导的Laravel核心服务都是通过服务提供器引导。
所谓的引导,实际上可以理解为注册服务容器绑定,事件监听器,中间件,甚至是路由,服务提供者是配置应用程序的中心。
providers数组是位于config/app.php配置文件中,用来配置引入的服务提供者的类的。
每一个服务提供者都会继承Illuminate\Support\ServiceProvider类,大多数会提供一个register和一个boot方法。register方法是将服务绑定到服务容器的功能。
使用Artisan命令行,通过make:provider生成一个新的提供者。
在任何服务提供器方法中,总是通过$app属性来访问服务容器。
关于服务容器的相关解释;是一个用于管理类依赖以及实现依赖注入的强有力工具,依赖注入指的是通过构造函数或者谋者情况下通过setter方法将类依赖“注入”到类中。
什么叫自动和零配置依赖注入?
直接用use引入,就可以使用了。为什么?是因为容器在后台管理吗?
什么时候需要和容器手动打交道?
如果编写了一个实现接口的类,并希望在路由或类的构造函数上键入该接口的提示,则必须告诉容器应该怎么解析该接口,其二是
如果编写的是一个Laravel包计划共享,那么可能需要将包的服务绑定到容器中。
use App\Services\Transistor;
use App\Services\PodcastParser;
//第一个参数是要绑定的类或接口名,第二个参数是一个返回类实例的闭包。
$this->app->bind(Transistor::class, function ($app) {
return new Transistor($app->make(PodcastParser::class));
});
单例的绑定,singleton方法将类或接口绑定到只应该解析一次的容器中,解析单例绑定后续调用容器时将返回相同的对象实例。
scoped方法将一个类或接口绑定到容器中,该容器只应在给定的Laravel请求/作业生命周期内解析一次,和singleton的区别是当开始新的生命周期时,scope方法注册的实例将会刷新
绑定接口到实现,第一个参数是接口,第二个参数是实现
use App\Contracts\EventPusher;
use App\Services\RedisEventPusher;
$this->app->bind(EventPusher::class, RedisEventPusher::class);
服务提供者的延迟加载
Facade为应用程序的服务容器中可用的类提供了静态代理,啥玩意?
实际上就是加载的时候加载的是Facade/Cache,对应的内容是Illuminate\Contracts\Cache\Factory中的内容。也就是卓,facade对应使用的是服务容器中的方法。
请求周期:
开始的地方是public/index.php,所有的请求都由web服务器配置定向到这个文件。之后根据进入应用的请求类型。选择传入的请求是进入Http内核还是Console内核。
Http内核定义了一个Http中间件列表,这些中间件处理读写Http会话,确定应用程序是否处于维护模式,校验CSRF令牌。Http内核接收Request接口并且返回Response接口。之后是加载服务提供者。
RouteServiceProvider,返回响应,响应通过路由的中间件返回,从而使应用程序有机会修改或检查传出的响应,一旦响应通过中间件返回,http内核的handle方法将返回响应对象,并且index.php文件在返回的响应上调用send方法。send方法将响应内容发送到用户的web浏览器,至此已经完成了整个Laravel请求生命周期的过程。
服务提供者重要。