通常一个框架会提供一种获取配置文件的操作类,该类的作用是,加载用户自定义配置文件,读取和设置配置文件等操作。
我们规定用户配置文件目录为 origin/app/conf
,在该目录下,config.php
是默认的配置文件,此外,还可以在该目录下创建其他配置文件,例如 db.php
,server.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;
}
- 使用
::
执行方法时,该方法需要声明为protected
,如Config::get($key);
。 - 如果
$key
为空,则返回所有配置。 - 通过
.
来解析多维数组配置。 - 如果为找到对应值,根据是否设置默认值返回结果。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。