IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 【laravel8】生命周期 -> 正文阅读

[PHP知识库]【laravel8】生命周期

在开始之前需要了解一些单词的意思,这对读代码非常有帮助。

resolve:解析(递归地实例化)

abstract:抽象类

Concrete:具体的

instance:实例化

instances:实例

bind:绑定。在laravel中指把一个契约(核心接口)与其具体实现的类的对应关系存入app容器类的变量里,例如:把缓存类与redis绑定,把数据库类与mysql绑定。

Alias:别名。例如app是\Illuminate\Contracts\Container\Container::class的别名,这是为了程序简短易读。

resolved:已解析的

laravel处理的请求包含http请求和console请求,http到达/public/index.php,console到达/artisan。区别在于所解析的核心类不同,一个是http,一个是console。

1.请求到达public/index.php,执行此文件。与以前版本不同,这里会先判断是否处于维护模式。

2.之后composer自动加载运行所需类库,比如此过程中会以文件的方式自动加载助手函数。

(此过程中会以文件的方式自动加载(autoload)助手函数,所以助手函数在构建app容器时就可用了,所有用到它的都不需要引用。)

这是我本地composer.lock中摘出的

"autoload": {
                "files": [
                    "src/Illuminate/Collections/helpers.php",
                    "src/Illuminate/Events/functions.php",
                    "src/Illuminate/Foundation/helpers.php",
                    "src/Illuminate/Support/helpers.php"
                ],
                "psr-4": {
                    "Illuminate\\": "src/Illuminate/",
                    "Illuminate\\Support\\": [
                        "src/Illuminate/Macroable/",
                        "src/Illuminate/Collections/"
                    ]
                }
            },

autoload的好处?可以实现按需加载,一次加载到内存就不需要重复加载了。

3.实例化app容器,绑定几个重要接口及其实现类

/*
| Check If Application Is Under Maintenance
 维护模式直接返回*/

if (file_exists(__DIR__.'/../storage/framework/maintenance.php')) {
    require __DIR__.'/../storage/framework/maintenance.php';
}

/*composer加载类库*/

require __DIR__.'/../vendor/autoload.php';

/*实例化app容器,绑定几个重要接口*/

$app = require_once __DIR__.'/../bootstrap/app.php';

//创建Kernel::class的服务提供者,在这些服务提供者中实现了注册服务容器绑定、事件监听、路由
$kernel = $app->make(Kernel::class);

//获取一个 Request ,返回一个 Response
$response = tap($kernel->handle(
    $request = Request::capture()
))->send();

//关闭框架,停止服务。
$kernel->terminate($request, $response);

第三步的详解:打开__DIR__.'/../bootstrap/app.php',

<?php

/*Create The Application   (从当前项目根目录)创建新的app应用实例*/

$app = new Illuminate\Foundation\Application(
    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);

/*绑定重要接口(内核绑定)
在这里,Illuminate\Contracts\Http\Kernel::class 是接口,它是抽象的,App\Http\Kernel::class是为它指定的实现方式,它是包含具体实现方式的类。这是告诉容器http、console、debug这几个核心服务的提供者是谁。
普通绑定bind就可以,这三个核心singleton是单例模式绑定的
这里有疑问的话,可以先看一下依赖注入、容器的原理:https://learnku.com/docs/laravel-core-concept/5.5/依赖注入,控制翻转,反射/3017
*/

$app->singleton(
    Illuminate\Contracts\Http\Kernel::class,
    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
);

return $app;

上述/../bootstrap/app.php文件中创建app应用实例用到的Illuminate\Foundation\Application类,打开看一下:

namespace Illuminate\Foundation;

use Closure;
use Illuminate\Container\Container;
use Illuminate\Contracts\Foundation\Application as ApplicationContract;
use Illuminate\Contracts\Foundation\CachesConfiguration;
use Illuminate\Contracts\Foundation\CachesRoutes;
use Illuminate\Contracts\Http\Kernel as HttpKernelContract;
use Illuminate\Events\EventServiceProvider;
use Illuminate\Filesystem\Filesystem;
use Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables;
use Illuminate\Foundation\Events\LocaleUpdated;
use Illuminate\Http\Request;
use Illuminate\Log\LogServiceProvider;
use Illuminate\Routing\RoutingServiceProvider;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use Illuminate\Support\Env;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Str;
use RuntimeException;
use Symfony\Component\HttpFoundation\Request as SymfonyRequest;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\HttpKernelInterface;

//看,app容器继承了Container类,并且实现了这些核心接口
class Application extends Container implements ApplicationContract, CachesConfiguration, CachesRoutes, HttpKernelInterface
{
...
/** * Create a new Illuminate application instance.
     *实例化容器时候就会运行构造函数以创建新的应用程序实例:包含注册基本绑定、注册所有服务提供者、注册核心类的别名
     * @param  string|null  $basePath
     * @return void
     */
    public function __construct($basePath = null)
    {
        if ($basePath) {
            $this->setBasePath($basePath);
        }

        $this->registerBaseBindings();
        $this->registerBaseServiceProviders();
        $this->registerCoreContainerAliases();
    }


}

绑定有三种方式

bind:普通绑定

singleton:单例绑定

instance:绑定已经实例化了的实例

服务提供者是 Laravel 应用启动的中心,你自己的应用以及所有 Laravel 的核心服务都是通过服务提供者启动。

但是,我们所谓的「启动」指的是什么?通常,这意味着注册服务,包括注册服务容器绑定、事件监听器、中间件甚至路由。服务提供者是应用配置的中心。

boot方法在所有服务提供者被注册以后才会被调用,这就是说我们可以在其中访问框架已注册的所有其它服务。可以在 boot 方法中对依赖进行类型提示,服务容器会自动注入你所需要的依赖

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-07-11 16:27:06  更:2021-07-11 16:27:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 0:44:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码