首页 > 作文

ThinkPHP6源码分析之应用初始化

更新时间:2023-04-08 00:36:34 阅读: 评论:0

thinkphp6 源码分析之应用初始化

官方群点击此处。

app construct

先来看看在 __construct 中做了什么,基本任何框架都会在这里做一些基本的操作,也就是从这里开始延伸出去。

public function __construct(string $rootpath = ''){    $this->thinkpath   = dirname(__dir__) . directory_parator;    $this->rootpath    = $rootpath ? rtrim($rootpath, directory_parator) . directory_parator : $this->getdefaultrootpath();    $this->apppath     = $this->rootpath . 'app' . directory_parator;    $this->runtimepath = $this->rootpath . 'runtime' . directory_parator;    if (is_file($this->apppath . 'provider.php')) {        $this->bind(include $this->apppath . 'provider.php');    }    static::tinstance($this);    $this->instance('app', $this);    $this->instance('think\container', $this);}

● 从魔术的方法的参数 rootpath 来看,是支持自定义根目录路径的。

● 设置了 thinkpath, rootpath, apppath, runtimepath

● 绑定了默认的服务提供者,一共提供了两个,app\reques 和 app\exceptionhandle,实际上你使用的 request 就是它。具体到 apppath 查看

● 设置当前容器实例 app

● 将 app($this) 实例 绑定到容器中,分别是 app 和 think\container

这里需要注意的是 app 类是继承 container 的,所以就是将自身实例绑定到容器中。

在这里似乎整个应用就已经初始化结束了?这里我需要把一部分 request run 的内容放在这里说,因为那里才是框架主要的初始化工作,我并不认为将这一部分初始化工作放在 request run 中是合理的。

主要的初始化

public function initialize(){    $this->initialized = true;    $this->begintime = microtime(true);    $this->beginmem  = memory_get_usage();    // 加载环境变量    if (is_file($this->rootpath . '.env')) {        $this->env->load($this->rootpath . '.env');    }    $this->co白驹空谷nfigext = $this->env->get('config_ext', '.php');    $this->debugmodeinit();    // 加载全局初始化文件    $this->load();    // 加载框架默认语言包    $langt = $this->lang->defaultlangt();    $this->lang->load($this->thinkpath . 'lang' . directory_parator . $langt . '.php');    // 加载应用默认语言包    $this->loadlangpack($langt);    // 监听appinit    $this->event->trigger('appinit');    date_default_timezone_t($this->config->get('app.default_timezone', 'asia/shanghai'));    // 初始化    foreach ($this->initializers as $initializer) {        $this->make($initializer)->init($this);    }    return $this;}

● 加载 .env 环境变量文件

● 加载配置文件以及应用内的文件

● 加载应用内的 common.php

● 加载助手函数 在 thinkpath 目录下的 helper.php

● 加载配置文件

● 加载应用目录下的 event.php 事件

● 注册应用目录下的 rvice.php 服务

● 加载语言包

● 监听 appinit 事件,利用该事件可以做一些请求前的工作

● 设置时区

● 注入所有服务并且启动服务

服务注册

初始化过程中,进行服务注册,那么服务注册做了哪些事情呢?该如何使用的服务呢?

public function register($rvice, bool $force = fal){    $registered = $this->getrvice($rvice);    if ($registered && !$force) {        return $registered;    }    if (is_string($rvice)) {        $rvice = new $rvice($this);    }    if (method_exists($rvice, 'register')) {        $rvice->register();    }    if (property_exists($rvice, 'bind')) {        $this->bind($rvice->bind);    }    $this->rvices[] = $rvice;}

● 服务是否注册过,如果需要大庆师范强制重新注册

● 实例化服务

● 如果实现了 register 方法,则需要执行 register 方法

● 如果设置了 bind 属性,则需要将 rvice 实例绑定到容器

● 最后合并到整个 rvice 数组中,等待 boot

服务启动

目前在初始化的时候只有下面三个服务,在 $this->initializers 数组中

foreach ($this->initializers as $initializer) {        $this->make($initializer)->init($this);}

这三个服务分别是:

think\initializer\bootrvicethink\initializer\errorthink\initializer\registerrvice

● error 服务是用来处理框架异常和错误的

● registerrvice 从字面的意思就是注册服务的

● bootrvice 就是启用服务的

error 处理在之后再说,这里说一下 registerrvice 和 bootrvice。

当从 container 中 make 出 registerrvice 的时候

这里有个隐藏的静态方法 make,每次如果首次从 container 中 make 出来的实例对象都会执行 make 方法,当然首先必须你实现了该方法。

随后会执行 init 方法。当你进入到 registerrvice 的时候,你会看到该方泰山地下大裂谷法。方法内容如下:

public function init(app $app){    $file = $app->getrootpath() . 'runtime' . directory_parator . 'rvices.php';    $rvices = $this->rvices;    if (is_file($file)) {        $rvices = array_merge($rvices, include $file);    }    foreach ($rvices as $rvice) {        if (class_exists($rvice)) {            $app->register($rvice);        }    }}

该方法就很奇怪了,和我想象的有点不一样。服务是直接从 runtime 目录下面获取的,而非在 config 目录下的 rvice.php 中。为什么会这样呢?一吻之间由于 compor 的发展,tp 框架也可以提供包的自动发现的功能,这也证明了开发组在不断向社区靠拢。下面来看一下是如何实现的。

因为这都是得益于 compor 的,所以来看一下 rootpath 下的 compor.json,到最下面,你会发现下面的配置

"scripts": {    "p二七塔ost-autoload-dump": [        "@php think rvice:discover",        "@php think vendor:publish"    ]}

从配置来看,框架一共提供了两个指令,rvice:discover 和 vendor:publish。具体实现这里就不说了,你只需要知道包的发现是由 rvice:discover 实现的。

还有就是这里默认注入了三个服务。

paginatorrvice::class,validatervice::class,modelrvice::class,

最后再来看看 bootrvice,这个就很简单了。从命名来讲就不难看出,下面就是代码,正常的启动服务,但是这里要说明的是,服务类中必须实现了 boot 方法才会启动。

public function init(app $app){    $app->boot();}

以上就是thinkphp6源码分析之应用初始化的详细内容

以上内容希望帮助到大家,很多phper在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、tp6,laravel,yii2,redis,swoole、swoft、kafka、mysql优化、shell脚本、docker、微服务、nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的官方群点击此处。

本文发布于:2023-04-08 00:36:32,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/a1f744e15a3ec871f22aa2b5a24397a4.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:ThinkPHP6源码分析之应用初始化.doc

本文 PDF 下载地址:ThinkPHP6源码分析之应用初始化.pdf

下一篇:返回列表
标签:初始化   加载   方法   框架
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图