配置文件是在应用初始化的时候,加载进来的。
## 加载环境变量配置文件和惯例配置文件
在App的initialize的方法中进行加载,加载环境变量的配置文件,并获取配置中配置的配置文件的后缀名。
```
// 加载配置文件
if(is_file($this->rootpath . '.env')) {
$this->env->load($this->rootpath . '.env');
}
// 获取配置文件的后缀,默认是.php文件
$this->configExt = $this->env->get('config_ext', '.php');
```
## 加载应用配置和模块配置
在App的init方法中加载应用的配置和模块的配置
```
// 自动读取模块配置文件
if(is_dir($path . 'config')) {
// 模块目录下的config目录
$dir = $path . 'config' . DIRECTORY_SEPARATOR;
}else if(is_dir($this->configPath .$module )) {
// config目录下的模块目录
$dir = $this->configPath . $module;
}
```
然后列出配置文件目录下面的所有配置文件,更加配置文件的后缀,将文件的内容加载到Config类中
```
// scandir函数是列出目录下面的所有文件
$files = isset($dir) ? scandir($dir) : [];
foreach ($files as $file) {
// 判断符合条件的配置文件后缀,然后进行加载
if ('.' . pathinfo($file, PATHINFO_EXTENSION) === $this->configExt) {
$this->config->load($dir . $file, pathinfo($file, PATHINFO_FILENAME));
}
}
```
最终加载配置文件是在Config类的loadFile方法中完成的。通过Config类的set方法,将以数组的形式把配置文件中的配置项合并到Config类的config的属性中。因为tp支持不同类型的配置文件,所以这里使用了工程模式,将不同类型的配置文件中的配置项转换成数组的形式,提供给set方法。
```
$name = strtolower($name);
$type = pathinfo($file, PATHINFO_EXTENSION);
if ('php' == $type) {
return $this->set(include $file, $name);
} elseif ('yaml' == $type && function_exists('yaml_parse_file')) {
return $this->set(yaml_parse_file($file), $name);
}
return $this->parse($file, $type, $name);
```
Config类的set方法其实就是将配置文件中的配置项合并到config的属性中。