Passed
Push — master ( 289cbe...3ce129 )
by Anton
03:29
created

Router::__autoload()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 3
nc 3
nop 0
dl 0
loc 7
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * @package Cadmium\System\Utils
5
 * @author Anton Romanov
6
 * @copyright Copyright (c) 2015-2017, Anton Romanov
7
 * @link http://cadmium-cms.com
8
 */
9
10
namespace Utils {
11
12
	use Modules\Extend, Url;
13
14
	abstract class Router {
15
16
		private static $routes = [
17
18
			'/admin/login'                                  => 'Modules\Auth\Handler\Login',
19
			'/admin/reset'                                  => 'Modules\Auth\Handler\Reset',
20
			'/admin/recover'                                => 'Modules\Auth\Handler\Recover',
21
			'/admin/register'                               => 'Modules\Auth\Handler\Register',
22
			'/admin/content/pages'                          => 'Modules\Entitizer\Lister\Pages',
23
			'/admin/content/pages/create'                   => 'Modules\Entitizer\Handler\Create\Page',
24
			'/admin/content/pages/edit'                     => 'Modules\Entitizer\Handler\Edit\Page',
25
			'/admin/content/menuitems'                      => 'Modules\Entitizer\Lister\Menuitems',
26
			'/admin/content/menuitems/create'               => 'Modules\Entitizer\Handler\Create\Menuitem',
27
			'/admin/content/menuitems/edit'                 => 'Modules\Entitizer\Handler\Edit\Menuitem',
28
			'/admin/content/variables'                      => 'Modules\Entitizer\Lister\Variables',
29
			'/admin/content/variables/create'               => 'Modules\Entitizer\Handler\Create\Variable',
30
			'/admin/content/variables/edit'                 => 'Modules\Entitizer\Handler\Edit\Variable',
31
			'/admin/content/widgets'                        => 'Modules\Entitizer\Lister\Widgets',
32
			'/admin/content/widgets/create'                 => 'Modules\Entitizer\Handler\Create\Widget',
33
			'/admin/content/widgets/edit'                   => 'Modules\Entitizer\Handler\Edit\Widget',
34
			'/admin/content/filemanager'                    => 'Modules\Filemanager\Lister\Uploads',
35
			'/admin/content/filemanager/addons'             => 'Modules\Filemanager\Lister\Addons',
36
			'/admin/content/filemanager/addons/dir'         => 'Modules\Filemanager\Handler\Dir\Addons',
37
			'/admin/content/filemanager/addons/file'        => 'Modules\Filemanager\Handler\File\Addons',
38
			'/admin/content/filemanager/languages'          => 'Modules\Filemanager\Lister\Languages',
39
			'/admin/content/filemanager/languages/dir'      => 'Modules\Filemanager\Handler\Dir\Languages',
40
			'/admin/content/filemanager/languages/file'     => 'Modules\Filemanager\Handler\File\Languages',
41
			'/admin/content/filemanager/templates'          => 'Modules\Filemanager\Lister\Templates',
42
			'/admin/content/filemanager/templates/dir'      => 'Modules\Filemanager\Handler\Dir\Templates',
43
			'/admin/content/filemanager/templates/file'     => 'Modules\Filemanager\Handler\File\Templates',
44
			'/admin/content/filemanager/uploads'            => 'Modules\Filemanager\Lister\Uploads',
45
			'/admin/content/filemanager/uploads/dir'        => 'Modules\Filemanager\Handler\Dir\Uploads',
46
			'/admin/content/filemanager/uploads/file'       => 'Modules\Filemanager\Handler\File\Uploads',
47
			'/admin/content/filemanager/upload'             => 'Modules\Filemanager\Handler\Upload',
48
			'/admin/extend/addons'                          => 'Modules\Extend\Handler\Addons',
49
			'/admin/extend/languages'                       => 'Modules\Extend\Handler\Languages',
50
			'/admin/extend/templates'                       => 'Modules\Extend\Handler\Templates',
51
			'/admin/system/settings'                        => 'Modules\Settings\Handler\Common',
52
			'/admin/system/settings/admin'                  => 'Modules\Settings\Handler\Admin',
53
			'/admin/system/users'                           => 'Modules\Entitizer\Lister\Users',
54
			'/admin/system/users/create'                    => 'Modules\Entitizer\Handler\Create\User',
55
			'/admin/system/users/edit'                      => 'Modules\Entitizer\Handler\Edit\User',
56
			'/admin/system/information'                     => 'Modules\Informer\Handler\Information',
57
			'/admin'                                        => 'Modules\Informer\Handler\Dashboard',
58
			'/profile/login'                                => 'Modules\Profile\Handler\Auth\Login',
59
			'/profile/recover'                              => 'Modules\Profile\Handler\Auth\Recover',
60
			'/profile/register'                             => 'Modules\Profile\Handler\Auth\Register',
61
			'/profile/reset'                                => 'Modules\Profile\Handler\Auth\Reset',
62
			'/profile/edit'                                 => 'Modules\Profile\Handler\Edit',
63
			'/profile'                                      => 'Modules\Profile\Handler\Overview',
64
			'/captcha.png'                                  => 'Modules\Tools\Handler\Captcha',
65
			'/sitemap.xml'                                  => 'Modules\Tools\Handler\Sitemap'
66
		];
67
68
		/**
69
		 * Parse a path/handler
70
		 *
71
		 * @return string : the parsed path/handler
72
		 */
73
74
		private static function parseString(string $string, string $regex) {
75
76
			$parts = preg_split('/\//', $string, 0, PREG_SPLIT_NO_EMPTY);
77
78
			foreach ($parts as $name) if (!preg_match($regex, $name)) return false;
79
80
			# ------------------------
81
82
			return $parts;
83
		}
84
85
		/**
86
		 * Parse a route
87
		 */
88
89
		private static function parseRoute(string $name, array $route) {
90
91
			if (false === ($path = self::parseString($route['path'], REGEX_MAP_ITEM_PATH))) return;
92
93
			if (false === ($handler = self::parseString($route['handler'], REGEX_MAP_ITEM_HANDLER))) return;
94
95
			self::$routes['/' . implode('/', $path)] = ('Addons\\' . $name . '\\' . implode('\\', $handler));
96
		}
97
98
		/**
99
		 * Autoloader
100
		 */
101
102
		public static function __autoload() {
103
104
			foreach (Extend\Addons::getItems() as $item) {
105
106
				foreach ($item['routes'] as $route) self::parseRoute($item['name'], $route);
107
			}
108
		}
109
110
		/**
111
		 * Get a handler class by a url
112
		 *
113
		 * @return string : a class name or false if a handler for the given url is not set
114
		 */
115
116
		public static function getHandler(Url $url) {
117
118
			return (self::$routes[$url->getPath()] ?? false);
119
		}
120
	}
121
}
122