(二)面试官:聊一下你对配置文件加载的了解吧!

369 阅读2分钟

七、工厂模式加载其它类型的配置文件

在之前看到的loadFile方法中,文件类型为PHP或者yaml程序就打断了,就不会在去执行后边的pares方法。

那么这个parse方法是做什么的呢!

在这里插入图片描述 进入到paras这个方法后,首先看注释

随后使用了一个工厂模式去加载think/config/driver下的文件

在这里插入图片描述 进入到factory这个方法后,这块内容属于容器的就不过多解释了。

只需要知道这里最终会返回一个实例给paras方法的$object变量

在这里插入图片描述 最终还是使用在上文中提到的set方法,而内部的object->parse()就是执行返回对象的内部方法,例如下图展示三个类型。ini、json、xm三个类型都存在同样的方法

在这里插入图片描述 这是ini类型,其它俩个的类型也是一毛一样的,就是会有同样的方法来实现对应的功能

在这里插入图片描述 简单梳理一下工厂模式加载不同类型的配置

  • 把对应的类型传给一个方法
  • 然后这个方法返回对应的实例
  • 在用这个实例去调用类里边的方法
  • 所有实例里的方法名都是一致的

这里咔咔后期会单独出一篇文章模仿这个实现另一个功能,导图会有所有的文章链接哦!

在ini.php中看到了一个方法parse_ini_file,其实这个方法根据之前的学习就大概能了解到时把ini类型的配置文件转为数组形式。这里就不做演示了,很是简单哈!

那么其它俩种类型都是为了把文件数据转为数组的。

八、yaml初体验

yaml就是一个类似于xml、json数据通信方式,但是yaml是以数据为中心,而非标记语言为重点。

这里提到yaml是因为在框架源码中提到了这个,后边的流程也是需要走yaml,所以还是需要简单的了解一下哈!

安装yaml,直接到pcel里搜索yaml,下载对应的版本即可。下载方式跟之前yaconf安装一样的。

安装成功后就会在PHP中存在这个扩展。

这里需要注意的是需要在php.ini中把yaml扩展文件加进去哈!

如果不会就去Yaconf在window上安装那一栏去看是怎么安装的,安装那个流程就可以了。

在这里插入图片描述 安装完成后就是简单的使用了,在config中新建一个kaka.yaml文件。

并且写上如下的内容,切记在yaml中冒号后边需要空一格,yaml写法就不过多说了,毕竟平时不怎么用。

这里说明只是为了阅读框架代码而做的工作。

在这里插入图片描述 测试yaml数据读取

读取出来的数据就是一个数组,也就是说把yaml格式的数据转化为数组形式。

在这里插入图片描述 这个方法是从哪里知道的呢!

还记得在config类下loadFile方法中,根据文件扩展的不同加载不同形式的方法。

PHP类型的直接就走了set,yaml类型的把数据处理为数组后执行set方法

如果是其它类型的话就会在上边说的工厂模式返回对应类名的实例,并执行对应类里边的方法将格式都转化为数组形式。最终还是使用set方法

在这里插入图片描述 其它类型的配置文件最终都会走到set方法里边。

在这里插入图片描述
在这里插入图片描述

九、如何让框架加载其它类型的配置文件

在初始化应用和模块中有一个属性是configExt,这个属性就是文件的扩展

在这里插入图片描述 去找一下这个属性是在哪里设置的。

根据config配置文件加载流程,可以很清晰的看到init方法的上一层是初始化应用,也就是initialize方法。

那么这个属性肯定是在init方法之前就已经提前设定好了的。

返回到init方法的上一层initialize就直接可以看到这个值的设定。

在这里插入图片描述
在这里插入图片描述

这个值是从env的环境变量中获取的,如果没有则默认为php,所以就需要创建一个env的文件。

并且给一个默认值为yaml

在这里插入图片描述 这里给大家看一下变化,在5.1.34 LTS版本的时候存在一个bug,咔咔目前使用的是5.1.39 LTS 这个问题已经修复了。

这段代码相信都可以看出来,它是先对configExt进行了设置默认值,然后在去加载环境变量配置文件。

那么加载这个环境变量的这段代码就毫无任何意义,configExt的值永远都是.php

就算在env文件里边做了配置也不会获取得到。

在这里插入图片描述 在之前在config配置文件中添加了一个yaml的配置文件

在这里插入图片描述 那么这个时候就可以使用config类来获取yaml类型文件的配置了。

测试一下没有任何问题,数据是可以出来的。

但是实际项目中可不敢这么整啊!如果要把configExt这个值配置到环境变量,配置的是什么类型就需要把config目录下的所有配置文件全部转化为对应类型。

例如configExt设置的为.ini ,则就需要把config目录下的所有文件都改为ini文件形式

在这里插入图片描述 在这里插入图片描述 这块内容只是针对阅读源码后一个运用而已,实际项目中不要这样使用,因为在tp框架中所有的配置文件都是PHP类型的。

如果改为其它类型的话,就需要修改框架中所有的配置文件,这种事情能不干就不哈!

十、框架底层配置加载代码优化

thinkphp/library/think/Config.php中方法loadFile这里看起来是不是有点不太优雅了。

既然在方法最后使用parse方法,也就是之前提到的工厂模式加载其它类型的配置文件。

那么为何不让这个工厂模式也加载PHP和yaml类型的配置文件。

在这里插入图片描述 此时就需要在thinkphp/library/think/config/driver这个目录建立php文件和yaml文件了。

首先建立一个php文件。

并且仿照其它三个类型文件,在php文件类型中只需要判断是否为文件,然后把文件引入进来即可。

在框架中PHP类型的配置文件都是数组形式的,所以在Php.php文件中parse方法直接返回config属性即可。

在这里插入图片描述 开始开心的测试吧!之前在env的文件中配置了CONFIG_EXT这个值为yaml。

也就是说读取config目录下的配置文件时,只能读取扩展为yaml类型的文件。

所以需要先把这个值给改回来,等后面把yaml类型的工厂类写好之后就可以使用了。

为了测试方便在config目录下添加一个新的配置

在这里插入图片描述 然后把config类中的lodeFile方法中判断php和yaml类型的代码注释掉

在这里插入图片描述
在这里插入图片描述

在控制器读取config/app.php配置

在这里插入图片描述 打印结果

打印出来的结果没有任何瑕疵,也就说我们进行简单优化的代码并没有不适之处。 在这里插入图片描述 至于yaml也是一样的道理,只需要把最终的数据转为数组返回就行了。

在这里插入图片描述 以上就是咔咔对框架配置文件加载底层源码优化的解析过程,如有不适之处,可以评论区指出来。

十一、解析如何获取config如何获取配置

都知道在获取配置信息的时候直接使用\Config::get()就可以获取到配置文件的信息。

接下来咔咔就来剖析一下获取配置的流程。

在这里插入图片描述 框架给提供了几个方法来获取配置信息。

  • \Config::get('配置参数');
  • \Config::get('配置文件');
  • \Config::pull('配置文件');

这其中估计使用第一种的就很少了,第一种的方式就是直接获取所有配置文件中的对应的配置。

例如:想获取config目录下的应用名称配置

在这里插入图片描述 就可以直接用\Config::get('app_name');来直接获取

在这里插入图片描述 在这里插入图片描述 那么这个流程是怎么样的呢!

当直接获取配置参数时,走的代码流程就只有这俩个。

第一段是给加上前缀app

第二段是循环在config文件中获取数据。

这段代码如果你直接断点调试的话是看不到什么效果的,咔咔把这段代码给大家移到外面去执行,就会看的很清楚了。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述 咔咔将这段代码给移到了index控制器中,这样就可以看到的很清晰了

在这里插入图片描述 先看打印结果,确认没啥问题

在这里插入图片描述 其实这里的代码如果放在源码中执行你会看到很多其它的信息,会很影响信息的解读的。

但是咱们移植出来后,就可以确保代码的运行时没有其它的杂乱信息,有利于对信息的正确解读。

然后紧接着看这段代码,这段代码之前咔咔看的时候感觉没什么,但是越看你会越发现这块代码的设计很是优秀。

为什么会这样说呢!

首先这段代码会走第一次循环就是执行app,这次执行会在全部的config中获取出键值为app的配置信息。

然后把值再次赋值给config变量,执行第二次循环为app_name。

这里循环获取数据就是在第一次循环获取数据的基础上得到的。也就是第二次是在$config['app']下获取的数据。

由此可见这段代码设计的是多好啊!

在这里插入图片描述 至于其它俩个方法就交给你们了,可以简单的试着跟着咔咔一样把代码移植出来,然后一步一步的解读。

你就会发现代码的优美之处,看的多了,对于以后自己写代码也会提供很多的思路的。

十二、总结

对于框架中config源码的解析就到这里结束了,其实源码的解析并不是很多,而是用了大量的篇幅来介绍了间接使用的一些技术。

虽说这些技术在这个已经成型的框架中不能再进行好好的利用,但是最起码让我们知道了他们每一个扩展的作用。

例如Yaconf对于项目配置这块会有很大的帮助,可以让配置文件跟项目分离,确保项目安全和跟运维之间的协同。

在例如开篇说的ArrayAccess,这个就是提供像访问数组一样访问对象的接口而已,这个也就是一种好的思想,同理在以后得开发中也可以借鉴这种思想。

在配置文件这一篇中,咔咔认为最重要的就是使用工厂模式加载的不同类型配置文件,在这一节中咔咔也说了后期会在出一篇文章在进行解析的,这一节点的文章如果没事的话真的可以好好的阅读一下。

这个也是目前在阅读源码的过程中直接碰到的第一个设计模式,后边会遇到越来越多的设计模式,遇到在进行解析

之前跟着咔咔一起实现的优化框架源码的过程中,这个配置一定要改过来,否则你需要把框架所有的配置类型都需要改为对应的。

在这里插入图片描述
在这里插入图片描述

坚持学习、坚持写博、坚持分享是咔咔从业以来一直所秉持的信念。希望在偌大互联网中咔咔的文章能带给你一丝丝帮助。我是咔咔,下期见。