2

通常一个框架会提供一种获取配置文件的操作类,该类的作用是,加载用户自定义配置文件,读取和设置配置文件等操作。

我们规定用户配置文件目录为 origin/app/conf,在该目录下,config.php 是默认的配置文件,此外,还可以在该目录下创建其他配置文件,例如 db.phpserver.php 等,所有其他文件也会被自动加载。

定义规则

配置文件内容直接返回数组。示例

app/conf/config.php

<?php
return [
    'default' => [
        'controller' => 'index',
        'action' => 'index',
        'router' => 'querystring',
    ],
    'debug' => true,
    'cache' => 'redis',
];

app/conf/db.php

<?php
return [
    'mysql' => [
        'host'      => '127.0.0.1',
        'username'  => '',
        'password'  => '',
        'db'        => '',
        'port'      => 3306,
        'charset'   => 'utf8',
        'prefix'    => ''
    ],
    'redis' => [
        'scheme' => '',
        'host'   => '',
        'port'   => '',
    ]
];

使用规则

通过 Config::get($key) 来获取配置。

  • config.php 作为默认配置文件可以直接获取该配置文件内容,多维数组通过.分隔,例如
<?php

Config::get('debug');
Config::get('default.route');
  • db.php 或其他自定义配置文件,需要添加文件名前缀,例如
<?php

Config::get('db.mysql.host');
Config::get('db.redis.scheme');

Config 类

Config 类主要实现以下功能:

  • 加载用户配置文件
<?php

namespace core;

use dispatcher\Container;

class Config extends Container
{
    private $conf;
    
    public function __construct()
    {
        $conf = [];
        $path = APP_PATH.'/app/conf/';
        foreach (scandir($path) as $file) {
            if (substr($file,-4) != '.php') {
                continue;
            }
            $filename = $path.$file;
            
            if ($file == 'config.php') {
                //1
                $conf += require $filename;
            } else {
                //2
                $k = explode('.', $file)[0];
                $conf[$k] = require $filename;
            }
        }
        $this->conf = $conf;
    }

由于继承 Container,构造函数只执行一次,因此在 __construct() 中加载配置文件可以避免重复加载。

除了 config.php 外的其他配置文件,需要用文件名作为 key

  • 解析多维 key 和使用默认值
//1
protected function get($key = null, $default=null)
{
    //2
    if (empty($key)) {
        return $this->conf;
    }
    //3
    if (strpos($key, '.')) {
        $conf = $this->conf;
        foreach (explode('.', $key) as $k) {
            $conf = $conf[$k] ?? $default;
        }
        return $conf;
    }
    //4
    return $this->conf[$key] ?? $default;
}
  1. 使用 :: 执行方法时,该方法需要声明为 protected,如 Config::get($key);
  2. 如果 $key 为空,则返回所有配置。
  3. 通过 . 来解析多维数组配置。
  4. 如果为找到对应值,根据是否设置默认值返回结果。

entner
751 声望187 粉丝

青年 ---------------