Laravel 服务容器实例
laravel
框架的启动,类似电脑启动的过程。bootstrap/app.php
框架启动的引导程序,类似电脑的启动程序。application
框架的启动先创建服务容器,就好像电脑一样容纳着许多的软件。
laravel重要概念:服务容器、服务、服务提供者。
服务容器
可以理解为我们的电脑,它装载了各种软件。
核心服务 (Kernel)
框架运行所必须的服务会被实例化,好比电脑运行所必须系统软件。
而其他服务仅仅是注册到服务容器中,需要时才会被实例化,好比QQ、微信它只是待在硬盘里,不用的时候它是不运行的,但是它们已经被注册到电脑中。
服务提供者
服务是如何注册到服务容器中的呢?是服务提供者(provider)提供的。这相当于软件的安装程序,添加到电脑的注册表中。
契约
契约的产生,是为了规范,同时也是为了解耦。
这里我们把 laravel 中服务的概念,比作视频播放器。
视频播放器,是个抽象的概念,它基础的功能是播放视频。QQ播放器、暴风播放器…
视频播放器的功能是播放视频文件,实现它基础的功能的要求即是契约。
laravel 中 这种包含基础功能的类便是抽象接口类(interface),实现类需要实现它(implements)。契约 = interface
+ implements
。
一个服务配合另外的服务,共同完成一个目的,服务与服务之间是独立的,那么这便是低耦合。如果另一个服务需要播放器的功能,那么我所需要的播放器必须implement
播放器的interface
。
服务绑定
服务绑定的概念很好理解。前面讲了服务容器相当于电脑,服务相当于软件,服务提供者相当于软件的安装程序,契约相当于视频播放器必须有播放功能,那么服务绑定就相当于电脑的默认视频播放器。
你可以在电脑里安装了N个视频播放器软件,但如果打开一个视频的时候,默认软件决定了用哪个去播放它。
bootstrap/app.php 框架引导程序(电脑开机程序)
//创建服务容器
$app = new Illuminate\Foundation\Application(
realpath(__DIR__.'/../')
);
// 注册核心服务(电脑系统软件)
// singleton 翻译(单例)由于是核心,所以是共享的
$app->singleton(
Illuminate\Contracts\Http\Kernel::class,//http锲约
App\Http\Kernel::class //实现类
);
$app->singleton(
Illuminate\Contracts\Console\Kernel::class, //控制台契约
App\Console\Kernel::class //实现类
);
$app->singleton(
Illuminate\Contracts\Debug\ExceptionHandler::class,//异常处理契约
App\Exceptions\Handler::class //实现类
);
这三个核心,即分别是app目录
下的Console
、Exceptions
、Http
三个目录下的Kernel
核心文件。
核心的实例化
$app = require_once __DIR__.'/../bootstrap/app.php';
//$app->make();从容器中实例化Kernel核心契约类所绑定的核心实现类
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
$app->make
并不会指定实例化哪个实现类。这步相当于电脑要播放一个视频文件,具体打开哪个播放器,要看电脑设置的默认播放器是哪个。
上边代码Illuminate\Contracts\Http\Kernel::class
绑定的是App\Http\Kernel::class
,所以$kernel
是 App\Http\Kernel.php
这个类。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: