Completed
Push — 6.0 ( fba450...3d0b31 )
by yun
04:36
created

Config::set()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 15
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 3.1406

Importance

Changes 0
Metric Value
cc 3
eloc 9
nc 3
nop 2
dl 0
loc 15
ccs 6
cts 8
cp 0.75
crap 3.1406
rs 9.9666
c 0
b 0
f 0
1
<?php
2
// +----------------------------------------------------------------------
3
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
4
// +----------------------------------------------------------------------
5
// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
6
// +----------------------------------------------------------------------
7
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
8
// +----------------------------------------------------------------------
9
// | Author: liu21st <[email protected]>
10
// +----------------------------------------------------------------------
11
declare (strict_types = 1);
12
13
namespace think;
14
15
/**
16
 * 配置管理类
17
 */
18
class Config
19
{
20
    /**
21
     * 配置参数
22
     * @var array
23
     */
24
    protected $config = [];
25
26
    /**
27
     * 配置文件目录
28
     * @var string
29
     */
30
    protected $path;
31
32
    /**
33
     * 配置文件后缀
34
     * @var string
35
     */
36
    protected $ext;
37
38
    /**
0 ignored issues
show
Coding Style introduced by
Parameter $path should have a doc-comment as per coding-style.
Loading history...
Coding Style introduced by
Parameter $ext should have a doc-comment as per coding-style.
Loading history...
39
     * 构造方法
40
     * @access public
41
     */
42 11
    public function __construct(string $path = null, string $ext = '.php')
43
    {
44 11
        $this->path = $path ?: '';
45 11
        $this->ext  = $ext;
46 11
    }
47
48 9
    public static function __make(App $app)
2 ignored issues
show
Coding Style introduced by
Missing doc comment for function __make()
Loading history...
Coding Style introduced by
Method name "Config::__make" is invalid; only PHP magic methods should be prefixed with a double underscore
Loading history...
Coding Style introduced by
Public method name "Config::__make" must not be prefixed with an underscore
Loading history...
49
    {
50 9
        $path = $app->getConfigPath();
51 9
        $ext  = $app->getConfigExt();
52
53 9
        return new static($path, $ext);
54
    }
55
56
    /**
57
     * 加载配置文件(多种格式)
58
     * @access public
59
     * @param  string $file 配置文件名
60
     * @param  string $name 一级配置名
61
     * @return array
62
     */
63 1
    public function load(string $file, string $name = ''): array
64
    {
65 1
        if (is_file($file)) {
66 1
            $filename = $file;
67
        } elseif (is_file($this->path . $file . $this->ext)) {
68
            $filename = $this->path . $file . $this->ext;
69
        }
70
71 1
        if (isset($filename)) {
72 1
            return $this->parse($filename, $name);
73
        }
74
75
        return $this->config;
76
    }
77
78
    /**
79
     * 解析配置文件
80
     * @access public
81
     * @param  string $file 配置文件名
82
     * @param  string $name 一级配置名
83
     * @return array
84
     */
85 1
    protected function parse(string $file, string $name): array
86
    {
87 1
        $type = pathinfo($file, PATHINFO_EXTENSION);
88
89
        switch ($type) {
90 1
            case 'php':
91 1
                $config = include $file;
92 1
                break;
93
            case 'yml':
94
            case 'yaml':
95
                if (function_exists('yaml_parse_file')) {
96
                    $config = yaml_parse_file($file);
97
                }
98
                break;
99
            case 'ini':
100
                $config = parse_ini_file($file, true, INI_SCANNER_TYPED) ?: [];
101
                break;
102
            case 'json':
103
                $config = json_decode(file_get_contents($file), true);
104
                break;
105
        }
106
107 1
        return isset($config) && is_array($config) ? $this->set($config, strtolower($name)) : [];
108
    }
109
110
    /**
111
     * 检测配置是否存在
112
     * @access public
113
     * @param  string $name 配置参数名(支持多级配置 .号分割)
114
     * @return bool
115
     */
116 1
    public function has(string $name): bool
117
    {
118 1
        return !is_null($this->get($name));
119
    }
120
121
    /**
122
     * 获取一级配置
123
     * @access protected
124
     * @param  string $name 一级配置名
125
     * @return array
126
     */
127 10
    protected function pull(string $name): array
128
    {
129 10
        $name = strtolower($name);
130
131 10
        return $this->config[$name] ?? [];
132
    }
133
134
    /**
135
     * 获取配置参数 为空则获取所有配置
136
     * @access public
137
     * @param  string $name    配置参数名(支持多级配置 .号分割)
138
     * @param  mixed  $default 默认值
139
     * @return mixed
140
     */
141 11
    public function get(string $name = null, $default = null)
142
    {
143
        // 无参数时获取所有
144 11
        if (empty($name)) {
145
            return $this->config;
146
        }
147
148 11
        if (false === strpos($name, '.')) {
149 10
            return $this->pull($name);
150
        }
151
152 10
        $name    = explode('.', $name);
153 10
        $name[0] = strtolower($name[0]);
154 10
        $config  = $this->config;
155
156
        // 按.拆分成多维数组进行判断
157 10
        foreach ($name as $val) {
158 10
            if (isset($config[$val])) {
159 2
                $config = $config[$val];
160
            } else {
161 10
                return $default;
162
            }
163
        }
164
165 2
        return $config;
166
    }
167
168
    /**
169
     * 设置配置参数 name为数组则为批量设置
170
     * @access public
171
     * @param  array  $config 配置参数
172
     * @param  string $name 配置名
0 ignored issues
show
Coding Style introduced by
Expected 3 spaces after parameter name; 1 found
Loading history...
173
     * @return array
174
     */
175 2
    public function set(array $config, string $name = null): array
176
    {
177 2
        if (!empty($name)) {
178 2
            if (isset($this->config[$name])) {
179
                $result = array_merge($this->config[$name], $config);
180
            } else {
181 2
                $result = $config;
182
            }
183
184 2
            $this->config[$name] = $result;
185
        } else {
186
            $result = $this->config = array_merge($this->config, array_change_key_case($config));
187
        }
188
189 2
        return $result;
190
    }
191
192
}
193