Total Complexity | 60 |
Total Lines | 416 |
Duplicated Lines | 0 % |
Changes | 2 | ||
Bugs | 0 | Features | 0 |
Complex classes like Assets often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use Assets, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
25 | class Assets |
||
26 | { |
||
27 | use FilePathCollectorTrait; |
||
28 | |||
29 | /** |
||
30 | * Assets::$head |
||
31 | * |
||
32 | * @var \O2System\Framework\Http\Presenter\Assets\Positions\Head |
||
33 | */ |
||
34 | protected $head; |
||
35 | |||
36 | /** |
||
37 | * Assets::$body |
||
38 | * |
||
39 | * @var \O2System\Framework\Http\Presenter\Assets\Positions\Body |
||
40 | */ |
||
41 | protected $body; |
||
42 | |||
43 | // ------------------------------------------------------------------------ |
||
44 | |||
45 | /** |
||
46 | * Assets::__construct |
||
47 | */ |
||
48 | public function __construct() |
||
49 | { |
||
50 | $this->addFilePaths([ |
||
51 | PATH_RESOURCES, |
||
52 | PATH_RESOURCES . 'views' . DIRECTORY_SEPARATOR |
||
53 | ]); |
||
54 | |||
55 | $this->head = new Assets\Positions\Head(); |
||
56 | $this->body = new Assets\Positions\Body(); |
||
57 | } |
||
58 | |||
59 | // ------------------------------------------------------------------------ |
||
60 | |||
61 | /** |
||
62 | * Assets::autoload |
||
63 | * |
||
64 | * @param array $assets |
||
65 | * |
||
66 | * @return void |
||
67 | */ |
||
68 | public function autoload($assets) |
||
69 | { |
||
70 | foreach ($assets as $position => $collections) { |
||
71 | if (property_exists($this, $position)) { |
||
72 | |||
73 | if ($collections instanceof \ArrayObject) { |
||
74 | $collections = $collections->getArrayCopy(); |
||
75 | } |
||
76 | |||
77 | $this->{$position}->loadCollections($collections); |
||
78 | } elseif ($position === 'packages') { |
||
79 | $this->loadPackages($collections); |
||
80 | } elseif ($position === 'css') { |
||
81 | $this->loadCss($collections); |
||
82 | } elseif ($position === 'js') { |
||
83 | $this->loadJs($collections); |
||
84 | } |
||
85 | } |
||
86 | } |
||
87 | |||
88 | // ------------------------------------------------------------------------ |
||
89 | |||
90 | /** |
||
91 | * Assets::loadPackages |
||
92 | * |
||
93 | * @param array $packages |
||
94 | * |
||
95 | * @return void |
||
96 | */ |
||
97 | public function loadPackages($packages) |
||
98 | { |
||
99 | foreach ($packages as $package => $files) { |
||
100 | if (is_string($files)) { |
||
101 | $this->loadPackage($files); |
||
102 | } elseif (is_array($files)) { |
||
103 | $this->loadPackage($package, $files); |
||
104 | } elseif (is_object($files)) { |
||
105 | $this->loadPackage($package, get_object_vars($files)); |
||
106 | } |
||
107 | } |
||
108 | } |
||
109 | |||
110 | // ------------------------------------------------------------------------ |
||
111 | |||
112 | /** |
||
113 | * Assets::loadPackage |
||
114 | * |
||
115 | * @param string $package |
||
116 | * @param array $subPackages |
||
117 | * |
||
118 | * @return void |
||
119 | */ |
||
120 | public function loadPackage($package, $subPackages = []) |
||
121 | { |
||
122 | $packageDir = implode(DIRECTORY_SEPARATOR, [ |
||
123 | 'packages', |
||
124 | $package, |
||
125 | ]) . DIRECTORY_SEPARATOR; |
||
126 | |||
127 | if (count($subPackages)) { |
||
128 | |||
129 | if (array_key_exists('libraries', $subPackages)) { |
||
130 | foreach ($subPackages[ 'libraries' ] as $subPackageFile) { |
||
131 | $pluginDir = $packageDir . 'libraries' . DIRECTORY_SEPARATOR; |
||
132 | $pluginName = $subPackageFile; |
||
133 | |||
134 | if ($this->body->loadFile($pluginDir . $pluginName . DIRECTORY_SEPARATOR . $pluginName . '.js')) { |
||
|
|||
135 | $this->head->loadFile($pluginDir . $pluginName . DIRECTORY_SEPARATOR . $pluginName . '.css'); |
||
136 | } else { |
||
137 | $this->body->loadFile($pluginDir . $pluginName . '.js'); |
||
138 | } |
||
139 | } |
||
140 | |||
141 | unset($subPackages[ 'libraries' ]); |
||
142 | } |
||
143 | |||
144 | $this->head->loadFile($packageDir . $package . '.css'); |
||
145 | $this->body->loadFile($packageDir . $package . '.js'); |
||
146 | |||
147 | foreach ($subPackages as $subPackage => $subPackageFiles) { |
||
148 | if ($subPackage === 'theme' or $subPackage === 'themes') { |
||
149 | if (is_string($subPackageFiles)) { |
||
150 | $subPackageFiles = [$subPackageFiles]; |
||
151 | } |
||
152 | |||
153 | foreach ($subPackageFiles as $themeName) { |
||
154 | $themeDir = $packageDir . 'themes' . DIRECTORY_SEPARATOR; |
||
155 | |||
156 | if ($this->head->loadFile($themeDir . $themeName . DIRECTORY_SEPARATOR . $themeName . '.css')) { |
||
157 | $this->body->loadFile($themeDir . $themeName . DIRECTORY_SEPARATOR . $themeName . '.js'); |
||
158 | } else { |
||
159 | $this->head->loadFile($themeDir . $themeName . '.css'); |
||
160 | } |
||
161 | } |
||
162 | } elseif ($subPackage === 'plugins') { |
||
163 | foreach ($subPackageFiles as $subPackageFile) { |
||
164 | $pluginDir = $packageDir . 'plugins' . DIRECTORY_SEPARATOR; |
||
165 | $pluginName = $subPackageFile; |
||
166 | |||
167 | $pluginName = str_replace(['\\', '/'], DIRECTORY_SEPARATOR, $pluginName); |
||
168 | if (strpos($pluginName, DIRECTORY_SEPARATOR) !== false) { |
||
169 | $pluginDir .= pathinfo($pluginName, PATHINFO_DIRNAME) . DIRECTORY_SEPARATOR; |
||
170 | $pluginName = pathinfo($pluginName, PATHINFO_BASENAME); |
||
171 | } |
||
172 | |||
173 | if ($this->body->loadFile($pluginDir . $pluginName . DIRECTORY_SEPARATOR . $pluginName . '.js')) { |
||
174 | $this->head->loadFile($pluginDir . $pluginName . DIRECTORY_SEPARATOR . $pluginName . '.css'); |
||
175 | } else { |
||
176 | $this->body->loadFile($pluginDir . $pluginName . '.js'); |
||
177 | } |
||
178 | } |
||
179 | } elseif ($subPackage === 'libraries') { |
||
180 | foreach ($subPackageFiles as $subPackageFile) { |
||
181 | $libraryDir = $packageDir . 'libraries' . DIRECTORY_SEPARATOR; |
||
182 | $libraryName = $subPackageFile; |
||
183 | |||
184 | $libraryName = str_replace(['\\', '/'], DIRECTORY_SEPARATOR, $libraryName); |
||
185 | if (strpos($libraryName, DIRECTORY_SEPARATOR) !== false) { |
||
186 | $libraryDir .= pathinfo($libraryName, PATHINFO_DIRNAME) . DIRECTORY_SEPARATOR; |
||
187 | $libraryName = pathinfo($libraryName, PATHINFO_BASENAME); |
||
188 | } |
||
189 | |||
190 | if ($this->body->loadFile($libraryDir . $libraryName . DIRECTORY_SEPARATOR . $libraryName . '.js')) { |
||
191 | $this->head->loadFile($libraryDir . $libraryName . DIRECTORY_SEPARATOR . $libraryName . '.css'); |
||
192 | } else { |
||
193 | $this->body->loadFile($libraryDir . $libraryName . '.js'); |
||
194 | } |
||
195 | } |
||
196 | } |
||
197 | } |
||
198 | } else { |
||
199 | $this->head->loadFile($packageDir . $package . '.css'); |
||
200 | $this->body->loadFile($packageDir . $package . '.js'); |
||
201 | } |
||
202 | } |
||
203 | |||
204 | // ------------------------------------------------------------------------ |
||
205 | |||
206 | /** |
||
207 | * Assets::loadCss |
||
208 | * |
||
209 | * @param string|array $files |
||
210 | * |
||
211 | * @return void |
||
212 | */ |
||
213 | public function loadCss($files) |
||
214 | { |
||
215 | $files = is_string($files) ? [$files] : $files; |
||
216 | $this->head->loadCollections(['css' => $files]); |
||
217 | } |
||
218 | |||
219 | // ------------------------------------------------------------------------ |
||
220 | |||
221 | /** |
||
222 | * Assets::loadJs |
||
223 | * |
||
224 | * @param string|array $files |
||
225 | * @param string $position |
||
226 | * |
||
227 | * @return void |
||
228 | */ |
||
229 | public function loadJs($files, $position = 'body') |
||
230 | { |
||
231 | $files = is_string($files) ? [$files] : $files; |
||
232 | $this->{$position}->loadCollections(['js' => $files]); |
||
233 | } |
||
234 | |||
235 | // ------------------------------------------------------------------------ |
||
236 | |||
237 | /** |
||
238 | * Assets::loadFiles |
||
239 | * |
||
240 | * @param array $assets |
||
241 | * |
||
242 | * @return void |
||
243 | */ |
||
244 | public function loadFiles($assets) |
||
245 | { |
||
246 | foreach ($assets as $type => $item) { |
||
247 | $addMethod = 'load' . ucfirst($type); |
||
248 | |||
249 | if (method_exists($this, $addMethod)) { |
||
250 | call_user_func_array([&$this, $addMethod], [$item]); |
||
251 | } |
||
252 | } |
||
253 | } |
||
254 | |||
255 | // ------------------------------------------------------------------------ |
||
256 | |||
257 | /** |
||
258 | * Assets::theme |
||
259 | * |
||
260 | * @param string $path |
||
261 | * |
||
262 | * @return string |
||
263 | */ |
||
264 | public function theme($path) |
||
265 | { |
||
266 | $path = str_replace(['\\', '/'], DIRECTORY_SEPARATOR, $path); |
||
267 | |||
268 | if (is_file($filePath = PATH_THEME . $path)) { |
||
269 | return path_to_url($filePath); |
||
270 | } |
||
271 | } |
||
272 | |||
273 | // ------------------------------------------------------------------------ |
||
274 | |||
275 | /** |
||
276 | * Assets::file |
||
277 | * |
||
278 | * @param string $file |
||
279 | * |
||
280 | * @return string |
||
281 | */ |
||
282 | public function file($file) |
||
283 | { |
||
284 | $filePaths = loader()->getPublicDirs(true); |
||
285 | |||
286 | foreach ($filePaths as $filePath) { |
||
287 | if (is_file($filePath . $file)) { |
||
288 | return path_to_url($filePath . $file); |
||
289 | break; |
||
290 | } |
||
291 | } |
||
292 | } |
||
293 | |||
294 | // ------------------------------------------------------------------------ |
||
295 | |||
296 | /** |
||
297 | * Assets::image |
||
298 | * |
||
299 | * @param string $image |
||
300 | * |
||
301 | * @return string |
||
302 | */ |
||
303 | public function image($image) |
||
304 | { |
||
305 | $filePaths = loader()->getPublicDirs(true); |
||
306 | $image = str_replace(['\\', '/'], DIRECTORY_SEPARATOR, $image); |
||
307 | |||
308 | foreach ($filePaths as $filePath) { |
||
309 | $filePath .= 'img' . DIRECTORY_SEPARATOR; |
||
310 | |||
311 | if (is_file($filePath . $image)) { |
||
312 | return path_to_url($filePath . $image); |
||
313 | break; |
||
314 | } |
||
315 | |||
316 | unset($filePath); |
||
317 | } |
||
318 | } |
||
319 | |||
320 | // ------------------------------------------------------------------------ |
||
321 | |||
322 | /** |
||
323 | * Assets::media |
||
324 | * |
||
325 | * @param string $media |
||
326 | * |
||
327 | * @return string |
||
328 | */ |
||
329 | public function media($media) |
||
330 | { |
||
331 | $filePaths = loader()->getPublicDirs(true); |
||
332 | $media = str_replace(['\\', '/'], DIRECTORY_SEPARATOR, $media); |
||
333 | |||
334 | foreach ($filePaths as $filePath) { |
||
335 | $filePath .= 'media' . DIRECTORY_SEPARATOR; |
||
336 | |||
337 | if (is_file($filePath . $media)) { |
||
338 | return path_to_url($filePath . $media); |
||
339 | break; |
||
340 | } |
||
341 | |||
342 | unset($filePath); |
||
343 | } |
||
344 | } |
||
345 | |||
346 | // ------------------------------------------------------------------------ |
||
347 | |||
348 | /** |
||
349 | * Assets::parseSourceCode |
||
350 | * |
||
351 | * @param string $sourceCode |
||
352 | * |
||
353 | * @return string |
||
354 | */ |
||
355 | public function parseSourceCode($sourceCode) |
||
356 | { |
||
357 | $sourceCode = str_replace( |
||
358 | [ |
||
359 | '"../assets/', |
||
360 | "'../assets/", |
||
361 | "(../assets/", |
||
362 | ], |
||
363 | [ |
||
364 | '"' . base_url() . '/assets/', |
||
365 | "'" . base_url() . '/assets/', |
||
366 | "(" . base_url() . '/assets/', |
||
367 | ], |
||
368 | $sourceCode); |
||
369 | |||
370 | if (presenter()->theme) { |
||
371 | $sourceCode = str_replace( |
||
372 | [ |
||
373 | '"assets/', |
||
374 | "'assets/", |
||
375 | "(assets/", |
||
376 | |||
377 | // with dot |
||
378 | '"./assets/', |
||
379 | "'./assets/", |
||
380 | "(./assets/", |
||
381 | ], |
||
382 | [ |
||
383 | '"' . presenter()->theme->getUrl('assets/'), |
||
384 | "'" . presenter()->theme->getUrl('assets/'), |
||
385 | "(" . presenter()->theme->getUrl('assets/'), |
||
386 | |||
387 | // with dot |
||
388 | '"' . presenter()->theme->getUrl('assets/'), |
||
389 | "'" . presenter()->theme->getUrl('assets/'), |
||
390 | "(" . presenter()->theme->getUrl('assets/'), |
||
391 | ], |
||
392 | $sourceCode); |
||
393 | } |
||
394 | |||
395 | // Valet path fixes |
||
396 | if (isset($_SERVER[ 'SCRIPT_FILENAME' ])) { |
||
397 | $valetPath = dirname($_SERVER[ 'SCRIPT_FILENAME' ]) . DIRECTORY_SEPARATOR; |
||
398 | } else { |
||
399 | $PATH_ROOT = $_SERVER[ 'DOCUMENT_ROOT' ]; |
||
400 | |||
401 | if (isset($_SERVER[ 'PHP_SELF' ])) { |
||
402 | $valetPath = $PATH_ROOT . dirname($_SERVER[ 'PHP_SELF' ]) . DIRECTORY_SEPARATOR; |
||
403 | } elseif (isset($_SERVER[ 'DOCUMENT_URI' ])) { |
||
404 | $valetPath = $PATH_ROOT . dirname($_SERVER[ 'DOCUMENT_URI' ]) . DIRECTORY_SEPARATOR; |
||
405 | } elseif (isset($_SERVER[ 'REQUEST_URI' ])) { |
||
406 | $valetPath = $PATH_ROOT . dirname($_SERVER[ 'REQUEST_URI' ]) . DIRECTORY_SEPARATOR; |
||
407 | } elseif (isset($_SERVER[ 'SCRIPT_NAME' ])) { |
||
408 | $valetPath = $PATH_ROOT . dirname($_SERVER[ 'SCRIPT_NAME' ]) . DIRECTORY_SEPARATOR; |
||
409 | } |
||
410 | } |
||
411 | |||
412 | if (isset($valetPath)) { |
||
413 | $sourceCode = str_replace($valetPath, '/', $sourceCode); |
||
414 | } |
||
415 | |||
416 | return $sourceCode; |
||
417 | } |
||
418 | |||
419 | // ------------------------------------------------------------------------ |
||
420 | |||
421 | /** |
||
422 | * Assets::getHead |
||
423 | * |
||
424 | * @return \O2System\Framework\Http\Presenter\Assets\Positions\Head |
||
425 | */ |
||
426 | public function getHead() |
||
427 | { |
||
428 | return $this->head; |
||
429 | } |
||
430 | |||
431 | // ------------------------------------------------------------------------ |
||
432 | |||
433 | /** |
||
434 | * Assets::getBody |
||
435 | * |
||
436 | * @return \O2System\Framework\Http\Presenter\Assets\Positions\Body |
||
437 | */ |
||
438 | public function getBody() |
||
441 | } |
||
442 | } |
||
443 |
This check looks for function or method calls that always return null and whose return value is used.
The method
getObject()
can return nothing but null, so it makes no sense to use the return value.The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.