laravel的服务容器(药箱)服务提供者(小盒子)Facades(更方便用药),方便大家透彻理解

Posted 瑛雄

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了laravel的服务容器(药箱)服务提供者(小盒子)Facades(更方便用药),方便大家透彻理解相关的知识,希望对你有一定的参考价值。

服务容器(药箱)
  就是这个$app

绑定(放药)

  $app->bind(‘Apple‘, function(){
    return 一个对象;
  })

解析(取药)

  resolve(‘Apple‘); //返回一个上面设定好的对象
  $this->app->make(‘HelpSpotAPI‘);
  app()->make(‘HelpSpotAPI‘);
  app(‘HelpSpotAPI‘);
  app()[‘HelpSpotAPI‘]
  app()->get(‘HelpSpotAPI‘)
  public function xxx(HelpSpotAPI $users)

  // 注入依赖
  $api = $this->app->makeWith(‘HelpSpotAPI‘, [‘id‘ => 1]);
  $api = app(‘HelpSpotAPI‘, [‘id‘ => 1]);
  $api = resolve(‘HelpSpotAPI‘, [‘id‘ => 1]);


服务提供者(小盒子)
  增加服务提供者是因为药箱里药太乱了,什么药都可以乱放或者说我们不知道里面有哪些药,所以现在要把药放到小盒子里,然后再把它注册好(config/app.php中注册,这样方便让我们知道我们有哪些小盒子)之后放进药箱里,这样
没有注册的小盒子里的药就解析不到,注册了的就可以取药。

创建服务提供者(创建小盒子)

  php artisan make:provider AbcServiceProvider

绑定服务(把药放进小盒子里)
  通过register()可以把绑定的服务启动时就将服务对象自动加载进内存,也就是放药(需要先进行下面的注册操作才可以),这样后面要用到的话才可以取药,当然,也有延迟的服务提供者,可以等到需要的时候再加载到内存中(需要该服务提供者去实现延迟provider接口)

  public function register () {
    $this->app->bind(‘Abc‘, function() {
      return 一个Abc服务对象;
    })
  }

  //容器调用完所有服务提供者的register方法之后才会调用boot方法
  public function boot () {

  }

  //实现延迟服务提供者接口才可以使用
  public function provides() {
    return ...
  }

注册服务提供者(把小盒子放进药箱里)
会自动加载注册了的服务提供者

注意: 不注册的话药箱里找不到这个小盒子也就找不到这个药

在 config/app.php中注册

/*
|--------------------------------------------------------------------------
| Autoloaded Service Providers
|--------------------------------------------------------------------------
|
| The service providers listed here will be automatically loaded on the
| request to your application. Feel free to add your own services to
| this array to grant expanded functionality to your applications.
|
*/
  ‘providers‘ => [
    /*
    * Application Service Providers...
    */
    AppProviderAbcServiceProvider::class
  ],

Facades(更方便用药)
之前的解析(取药):resolve(‘Apple‘),这样太麻烦了,我们如果要用到药,还得去查看它的标签是啥,例如是Apple

 

请求生命周期
1.所有请求必定首先通过 public/index.php。

2.在上述这个文件中首先加载 composer 自动加载文件,然后从
bootstrap/app.php 实例化一个服务容器。

3.接下来,框架会根据请求类型传送请求至 app/Http/Kernel.php 或者 app/Console/Kernel.php。

4.app/Http/Kernel.php 扩展了IlluminateFoundationHttpKernel 类,父类强制在处理请求前应该做哪些操作,操作内容都放到了 bootstrappers 数组里面(配置错
误处理、配置记录日志、检测应用环境、注册和启动服务提供者等)。子类在数组 middleware 中规定了请求在被处理前必须经过的一些处理(读写 session、判断是否处于维护模式、验证 csrf 令牌等)。

5.处理请求,返回响应内容。

以上是关于laravel的服务容器(药箱)服务提供者(小盒子)Facades(更方便用药),方便大家透彻理解的主要内容,如果未能解决你的问题,请参考以下文章

laravel 服务提供者和容器如何相互工作?

Laravel服务/服务提供者/容器/契约和门面

Laravel 中 IoC 容器 服务提供者和门面的使用

Laravel 中 IoC 容器 服务提供者和门面的使用

laravel服务容器

Laravel系列6.3框架启动与服务容器源码