Laravel学习-容器


容器基本认识

laravel框架应用程序的实例就是一个容器,改实例是在bootstrap/app.php内初始化:

1
$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里面引入自定义的服务提供者,我们就可以在代码中通过实例解析服务来使用扩展了。