@@ -38,22 +38,38 @@ public function values(string $path, array $scopes): array
38
38
{
39
39
$ levels = $ this ->getPathLevels ($ path );
40
40
41
- if (!$ this ->configCache ) {
42
- $ this ->configCache = $ this ->config ->get ('system ' );
43
- }
41
+ $ configCache = $ this ->getConfigCache ();
44
42
45
43
$ values = array_fill_keys ($ scopes , []);
46
- $ defaultScopeValues = $ this ->getScopeValues ($ this -> configCache ['default ' ], $ levels );
44
+ $ defaultScopeValues = $ this ->getScopeValues ($ configCache ['default ' ], $ levels );
47
45
48
- foreach ($ scopes as $ scope ) {
49
- if (!isset ($ this ->configCache [$ scope ])) {
50
- throw new InvalidArgumentException (__ ('Invalid scope key: ' . $ scope ));
51
- }
52
- if ($ scope === 'default ' ) {
53
- $ values [$ scope ] = $ defaultScopeValues ;
54
- continue ;
46
+ if (($ key = array_search ('default ' , $ scopes )) !== false ) {
47
+ $ values ['default ' ] = $ defaultScopeValues ;
48
+ unset($ scopes [$ key ]);
49
+ }
50
+
51
+ $ values = array_merge_recursive (
52
+ $ values ,
53
+ $ this ->getNonDefaultScopeValues ($ scopes , $ levels , $ defaultScopeValues )
54
+ );
55
+
56
+ foreach ($ values as $ scope => $ scopeData ) {
57
+ if (count ($ scopeData ) == 0 ) {
58
+ unset($ values [$ scope ]);
55
59
}
60
+ }
56
61
62
+ return $ values ;
63
+ }
64
+
65
+ private function getNonDefaultScopeValues (
66
+ array $ scopes ,
67
+ array $ levels ,
68
+ array $ defaultScopeValues
69
+ ): array {
70
+ $ values = [];
71
+ foreach ($ scopes as $ scope ) {
72
+ $ values [$ scope ] = [];
57
73
foreach ($ this ->configCache [$ scope ] as $ scopeKey => $ scopeData ) {
58
74
if (is_numeric ($ scopeKey ) || in_array ($ scopeKey , ['admin ' , 'default ' ])) {
59
75
continue ;
@@ -68,12 +84,6 @@ public function values(string $path, array $scopes): array
68
84
}
69
85
}
70
86
71
- foreach ($ values as $ scope => $ scopeData ) {
72
- if (count ($ scopeData ) == 0 ) {
73
- unset($ values [$ scope ]);
74
- }
75
- }
76
-
77
87
return $ values ;
78
88
}
79
89
@@ -109,33 +119,56 @@ protected function getScopeValues(array $scopeData, array $levels): array
109
119
return [];
110
120
}
111
121
112
- $ scopeData = $ scopeData [$ level1 ];
113
- if ($ level2 === '* ' && $ level3 === '* ' ) {
114
- return [$ level1 => $ scopeData ];
122
+ if ($ wildcardScopes = $ this ->getL3WildCardScopes ($ levels , $ scopeData )) {
123
+ return $ wildcardScopes ;
115
124
}
116
125
117
- if ($ level2 !== ' * ' && $ level3 === ' * ' ) {
118
- return [ $ level1 => [ $ level2 => $ scopeData [ $ level2 ]]] ;
126
+ if ($ wildcardScopes = $ this -> getL2WildCardScopes ( $ levels , $ scopeData ) ) {
127
+ return $ wildcardScopes ;
119
128
}
120
129
121
- if ($ level2 === '* ' && $ level3 !== '* ' ) {
122
- $ values = [$ level1 => []];
123
- foreach ($ scopeData as $ level2 => $ l3scopeData ) {
124
- foreach ($ l3scopeData as $ key => $ value ) {
125
- if ($ key === $ level3 ) {
126
- $ values [$ level1 ][$ level2 ] = $ values [$ level1 ][$ level2 ] ?? [];
127
- $ values [$ level1 ][$ level2 ][$ level3 ] = $ value ;
128
- }
130
+ $ scopeData = $ scopeData [$ level1 ];
131
+ if (isset ($ scopeData [$ level2 ]) && isset ($ scopeData [$ level2 ][$ level3 ])) {
132
+ return [$ level1 => [$ level2 => [$ level3 => $ scopeData [$ level2 ][$ level3 ]]]];
133
+ }
134
+
135
+ return [];
136
+ }
137
+
138
+ private function getL2WildCardScopes (array $ levels , array $ scopeData ): ?array
139
+ {
140
+ [$ level1 , $ level2 , $ level3 ] = $ levels ;
141
+
142
+ $ scopeData = $ scopeData [$ level1 ];
143
+ if ($ level2 !== '* ' ) {
144
+ return null ;
145
+ }
146
+ $ values = [$ level1 => []];
147
+ foreach ($ scopeData as $ level2 => $ l3scopeData ) {
148
+ foreach ($ l3scopeData as $ key => $ value ) {
149
+ if ($ key === $ level3 ) {
150
+ $ values [$ level1 ][$ level2 ] = $ values [$ level1 ][$ level2 ] ?? [];
151
+ $ values [$ level1 ][$ level2 ][$ level3 ] = $ value ;
129
152
}
130
153
}
131
- return $ values ;
132
154
}
155
+ return $ values ;
156
+ }
133
157
134
- if (isset ($ scopeData [$ level2 ]) && isset ($ scopeData [$ level2 ][$ level3 ])) {
135
- return [$ level1 => [$ level2 => [$ level3 => $ scopeData [$ level2 ][$ level3 ]]]];
158
+ private function getL3WildCardScopes (array $ levels , array $ scopeData ): ?array
159
+ {
160
+ [$ level1 , $ level2 , $ level3 ] = $ levels ;
161
+
162
+ $ scopeData = $ scopeData [$ level1 ];
163
+ if ($ level2 === '* ' && $ level3 === '* ' ) {
164
+ return [$ level1 => $ scopeData ];
136
165
}
137
166
138
- return [];
167
+ if ($ level2 !== '* ' && $ level3 === '* ' ) {
168
+ return [$ level1 => [$ level2 => $ scopeData [$ level2 ]]];
169
+ }
170
+
171
+ return null ;
139
172
}
140
173
141
174
/**
@@ -158,4 +191,13 @@ protected function getPathLevels(string $path): array
158
191
159
192
return $ levels ;
160
193
}
194
+
195
+ private function getConfigCache (): array
196
+ {
197
+ if (!$ this ->configCache ) {
198
+ $ this ->configCache = $ this ->config ->get ('system ' );
199
+ }
200
+
201
+ return $ this ->configCache ;
202
+ }
161
203
}
0 commit comments