容器基本认识
laravel框架应用程序的实例就是一个容器,改实例是在bootstrap/app.php内初始化:
$app = new Illuminate\Foundation\Application(
realpath(__DIR__ . '/../')
);
该实例在整个生命周期里是唯一的,后续相关的服务都是在该实例上执行的。
在项目中获取容器实例的方法
通过app函数获取
$app = app();
通过face获取
App::boot();
通过服务提供者的属性获取
服务提供者类都是由laravel容器实例化的,这些类都继承自Illuminate\Support\ServiceProvider,它定义了一个实例属性$app。
容器结构
容器的结构上包含了许多数组,用来存储各种服务,如果想要深入了解,需要搞清楚这些数组的含义。
实例如何绑定与解析服务
通过字面含义,容器是用来存储对象,服务的存入和取出就是绑定与解析的过程。
绑定服务的几种方式:
app()->singleton(...)
app()->bind(...)
app()['service'] =...
具体参考laravel的文档
解析服务的几种方式:
app()->make('service')
app()['service']
app('service')
如果都具体实现感兴趣可以深入去查看这些方法的实现。
服务提供者
前面提到了如何绑定与解析服务,那么具体的服务就得靠服务提供者来提供具体的服务了,所以服务提供者起到把具体的逻辑绑定到容器上的作用。
平时你一定发现每个laravel的扩展包都有一个继承Illuminate\Support\ServiceProvider的服务提供者类。
在我们的config/app.php里面引入自定义的服务提供者,我们就可以在代码中通过实例解析服务来使用扩展了。