laravel app服务容器

// 实例化服务容器
$app = require_once __DIR__.'/../bootstrap/app.php';

laravel的重要设计,便是服务容器、服务、服务提供者的设计。这很像我们的电脑。

服务容器,可以理解为我们的电脑,它装载了各种软件。容纳了非常多的服务(组件)。其中核心服务(框架运行所必须的服务)会被实例化,好比电脑运行所必须的软件。而其他服务仅仅是注册到服务容器中,需要时才会被实例化,好比QQ、微信它只是待在硬盘里,不用的时候它是不运行的,但是它们已经被注册到电脑中,名称便是xx.exe。

服务提供者,服务是如何注册到服务容器中的呢?是服务提供者(provider)提供的。这相当于软件的安装程序(install),添加到电脑的注册表中。
在这里插入图片描述

研究源码,必须明白什么是契约。

契约的产生,是为了规范,同时也是为了解耦。

任何服务从一诞生就定义了它基础的功能,而具体的实现是各种各样的,但必须实现其基础的功能。这种包含基础功能的类便是抽象接口类(interface),实现类需要实现它(implements)。可以理解契约便是interface与implements 。就像一个视频播放器起码得实现播放视频功能吧,否则很难进入应用市场。

一个服务配合或者需要另外的服务,共同完成一个目的,服务与服务之间是独立的,那么这便是低耦合。但彼此之间必须建立一种约定,我所需要的服务是什么样的,否则我用不了。这个约定就是interface,我提供接口,你需要implements实现它。

契约贯穿了laravel源码,随处可见,也是我们研究源码的入手点。

服务绑定

服务绑定的概念很好理解。前面讲了服务容器相当于电脑,服务是软件,服务提供者相当于软件的安装程序,契约相当于视频播放器必须有播放功能,那么服务绑定就相当于电脑的默认视频播放器

你可以在电脑里安装了N个视频播放器软件,但如果打开一个视频的时候,默认软件决定了用哪个去播放它。

以上便是下边要介绍的 bootstrap/app.php的全部内容

bootstrap/app.php

第一句代码,实例化服务容器,这个过程好像电脑开机的初始阶段,这行代码具体干了什么,需要再列一篇。

|---------------------------------------------------------------
|创建应用容器
|---------------------------------------------------------------
|我们要做的第一件事是创建一个新的Laravel应用容器实例
|是Laravel的所有成分的“胶水”
|用于系统绑定所有不同部分的IoC容器。

$app = new Illuminate\Foundation\Application(
    realpath(__DIR__.'/../')
);

中间三行代码,服务绑定

|---------------------------------------------------------------
|绑定重要接口
|---------------------------------------------------------------
|接下来,我们需要将一些重要的接口绑定到容器中
|我们将能够在需要的时候解析它们。
|核心程序处理来自web和CLI的对这个应用程序的传入请求。
| 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/应用目录的三个核心类
在这里插入图片描述
回头再在 index.php 中的一行代码,$app->make 并不会指定实例化哪个类,前面说电脑不会始终只打开某个播放器,只是打开播放器(抽象类),具体打开哪个播放器,看电脑设置的默认播放器是哪个。上边代码
Illuminate\Contracts\Http\Kernel::class 绑定的是App\Http\Kernel::class ,所以$kernelApp\Http\Kernel.php 这个类。

$app = require_once __DIR__.'/../bootstrap/app.php';
//$app->make();从容器中实例化Kernel核心契约类所绑定的核心实现类
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

最后一行代码

|---------------------------------------------------------------
|返回应用程序
|---------------------------------------------------------------
|这个脚本返回应用容器实例。
|实例($app)被给予调用脚本(index.php)
|这样我们就可以在实际运行应用时和发送响应时分别创建应用实例而互不影响
|(啥意思呢?就是运行中随时可以从容器中取出服务并实例化如index.php中的$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

return $app;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值