Passed
Push — master ( 3354b2...c3d752 )
by 世昌
01:43
created

Config::has()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
namespace nebula\application;
3
4
use nebula\application\exception\JSONException;
5
use nebula\application\exception\YamlException;
6
use nebula\component\arrayobject\ArrayDotAccess;
7
8
/**
9
 * 文件配置类
10
 */
11
class Config
12
{
13
    public $config=[];
14
15
    public function load(string $path, array $extra =[])
16
    {
17
        $data = $this->loadConfig($path, $extra);
18
        if ($data) {
19
            return $this->assign($data);
20
        }
21
    }
22
23
    public function loadConfig(string $path, array $extra =[]):?array
24
    {
25
        $data=null;
26
        if (!file_exists($path)) {
27
            $path =$this->resolve($path);
28
        }
29
        if ($path) {
30
            $ext = strtolower(pathinfo($path, PATHINFO_EXTENSION));
31
            switch ($ext) {
32
                case 'yml':
33
                case 'yaml':
34
                    if (function_exists('yaml_parse')) {
35
                        $name = 'yaml_parse';
36
                    } elseif (class_exists('Spyc')) {
37
                        $name = 'Spyc::YAMLLoadString';
38
                    } else {
39
                        throw new YamlException("parse yaml config error : missing yaml extension or spyc", 1);
40
                    }
41
                    $content = file_get_contents($path);
42
                    $content =$this->parseValue($content, $extra);
43
                    $data = \call_user_func_array($name, [$content]);
44
                    break;
45
                case 'php':
46
                    $data = include $path;
47
                    break;
48
                case 'ini':
49
                    $content = file_get_contents($path);
50
                    $content =$this->parseValue($content, $extra);
51
                    $data =  \parse_ini_string($content, true);
52
                    break;
53
                case 'json':
54
                default:
55
                    $content = file_get_contents($path);
56
                    $content =$this->parseValue($content, $extra);
57
                    $data = json_decode($content, true);
58
                    if (json_last_error()!==JSON_ERROR_NONE) {
59
                        throw new JSONException(json_last_error());
60
                    }
61
            }
62
        }
63
        return $data;
64
    }
65
66
    protected function parseValue(string $content, array $extra =[]):string
67
    {
68
        return preg_replace_callback('/\$\{(.+?)\}/', function ($matchs) use ($extra) {
69
            $name = $matchs[1];
70
            $value = $matchs[0];
0 ignored issues
show
Unused Code introduced by
The assignment to $value is dead and can be removed.
Loading history...
71
            if (($value = ArrayDotAccess::get($extra, $name, null))!==null) {
72
            } elseif (defined($name)) {
73
                $value = constant($name);
74
            } else {
75
                $value = $this->get($name, $value);
76
            }
77
            return is_string($value)?trim(json_encode($value), '"'):$value;
78
        }, $content);
79
    }
80
81
    public static function resolve(string $path):?string
82
    {
83
        if (file_exists($path)) {
84
            return $path;
85
        } else {
86
            $ext = pathinfo($path, PATHINFO_EXTENSION);
87
            if (empty($ext)) {
88
                $basepath = $path;
89
            } else {
90
                $basepath = pathinfo($path, PATHINFO_FILENAME);
91
            }
92
            if (file_exists($conf = $basepath.'.yml')  || file_exists($conf = $basepath.'.yaml')) {
93
                if (function_exists('yaml_parse') || class_exists('Spyc')) {
94
                    return $conf;
95
                }
96
            }
97
            if (file_exists($conf=$basepath.'.json')) {
98
                return $conf;
99
            } elseif (file_exists($conf=$basepath.'.php')) {
100
                return $conf;
101
            } elseif (file_exists($conf=$basepath.'.ini')) {
102
                return $conf;
103
            }
104
        }
105
        return null;
106
    }
107
108
    public function exist(string $path):bool
109
    {
110
        return$this->resolve($path) !== null;
111
    }
112
113
    public function assign(array $config)
114
    {
115
        return $this->config=array_merge($this->config, $config);
116
    }
117
118
    public function get(string $name=null, $default=null)
119
    {
120
        if (is_null($name)) {
121
            return $this->config;
122
        }
123
        return ArrayDotAccess::get($this->config, $name, $default);
124
    }
125
126
    public function set(string $name, $value, $combine=null)
127
    {
128
        return ArrayDotAccess::set($this->config, $name, $value, $combine);
129
    }
130
131
    public function has(string $name)
132
    {
133
        return ArrayDotAccess::exist($this->config, $name);
134
    }
135
}
136