Passed
Push — master ( 3a5a7b...e59e29 )
by Jean-Christophe
13:15
created

RouterCacheTrait   C

Complexity

Total Complexity 54

Size/Duplication

Total Lines 213
Duplicated Lines 0 %

Test Coverage

Coverage 59.41%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 54
eloc 112
dl 0
loc 213
ccs 82
cts 138
cp 0.5941
rs 6.4799
c 1
b 0
f 0

23 Methods

Rating   Name   Duplication   Size   Complexity  
A addControllerCache() 0 9 2
A addAdminRoutes() 0 2 1
A isExpired() 0 2 1
A initRouterCache() 0 7 2
A storeRouteResponse() 0 4 1
A controllerCacheUpdated() 0 12 3
A addRoutes_() 0 8 2
A setExpired() 0 4 2
A storeDynamicRoutes() 0 4 2
A getControllersFiles() 0 2 1
B getControllers() 0 24 9
A getRoutes() 0 3 1
A getRouteKey() 0 5 2
B getControllerRoutes() 0 18 7
A parseControllerFiles() 0 20 5
A getControllerCache() 0 5 3
A sortByPriority() 0 5 1
A expired() 0 2 1
A getRouteCache() 0 9 3
A setRouteCache() 0 4 1
A addRoutes() 0 2 1
A addRestRoutes() 0 2 1
A addRoute() 0 4 2

How to fix   Complexity   

Complex Class

Complex classes like RouterCacheTrait 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 RouterCacheTrait, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
namespace Ubiquity\cache\traits;
4
5
use Ubiquity\controllers\Startup;
6
use Ubiquity\controllers\Router;
7
use Ubiquity\cache\parser\ControllerParser;
8
use Ubiquity\cache\ClassUtils;
9
use Ubiquity\utils\base\UArray;
10
use Ubiquity\cache\CacheManager;
11
use Ubiquity\controllers\di\DiManager;
12
13
/**
14
 *
15
 * Ubiquity\cache\traits$RouterCacheTrait
16
 * This class is part of Ubiquity
17
 *
18
 * @author jcheron <[email protected]>
19
 * @version 1.0.5
20
 * @property \Ubiquity\cache\system\AbstractDataCache $cache
21
 *
22
 */
23
trait RouterCacheTrait {
24
25
	abstract protected static function _getFiles(&$config, $type, $silent = false);
26
27
	private static function addControllerCache($classname) {
28
		$parser = new ControllerParser ();
29
		try {
30
			$parser->parse ( $classname );
31
			return $parser->asArray ();
32
		} catch ( \Exception $e ) {
33
			// Nothing to do
34
		}
35
		return [ ];
36
	}
37
38 17
	private static function parseControllerFiles(&$config, $silent = false) {
39 17
		$routes = [ "rest" => [ ],"default" => [ ] ];
40 17
		$files = self::getControllersFiles ( $config, $silent );
41 17
		foreach ( $files as $file ) {
42 17
			if (is_file ( $file )) {
43 17
				$controller = ClassUtils::getClassFullNameFromFile ( $file );
44 17
				$parser = new ControllerParser ();
45
				try {
46 17
					$parser->parse ( $controller );
47 17
					$ret = $parser->asArray ();
48 17
					$key = ($parser->isRest ()) ? "rest" : "default";
49 17
					$routes [$key] = \array_merge ( $routes [$key], $ret );
50 1
				} catch ( \Exception $e ) {
51
					// Nothing to do
52
				}
53
			}
54
		}
55 17
		self::sortByPriority ( $routes ['default'] );
56 17
		self::sortByPriority ( $routes ['rest'] );
57 17
		return $routes;
58
	}
59
60 17
	protected static function sortByPriority(&$array) {
61
		uasort ( $array, function ($item1, $item2) {
62 17
			return UArray::getRecursive ( $item2, "priority", 0 ) <=> UArray::getRecursive ( $item1, "priority", 0 );
63 17
		} );
64 17
		UArray::removeRecursive ( $array, "priority" );
65 17
	}
66
67 7
	private static function initRouterCache(&$config, $silent = false) {
68 7
		$routes = self::parseControllerFiles ( $config, $silent );
69 7
		self::$cache->store ( "controllers/routes.default", "return " . UArray::asPhpArray ( $routes ["default"], "array" ) . ";", 'controllers' );
70 7
		self::$cache->store ( "controllers/routes.rest", "return " . UArray::asPhpArray ( $routes ["rest"], "array" ) . ";", 'controllers' );
71 7
		DiManager::init ( $config );
72 6
		if (! $silent) {
73 6
			echo "Router cache reset\n";
74
		}
75 6
	}
76
77 12
	public static function controllerCacheUpdated(&$config) {
78 12
		$result = false;
79 12
		$newRoutes = self::parseControllerFiles ( $config, true );
80 12
		$ctrls = self::getControllerCache ();
81 12
		if ($newRoutes ['default'] != $ctrls) {
82 6
			$result ['default'] = true;
83
		}
84 12
		$ctrls = self::getControllerCache ( true );
85 12
		if ($newRoutes ['rest'] != $ctrls) {
86 3
			$result ['rest'] = true;
87
		}
88 12
		return $result;
89
	}
90
91
	public static function storeDynamicRoutes($isRest = false) {
92
		$routes = Router::getRoutes ();
93
		$part = ($isRest) ? 'rest' : 'default';
94
		self::$cache->store ( "controllers/routes." . $part, "return " . UArray::asPhpArray ( $routes, "array" ) . ";", 'controllers' );
95
	}
96
97
	private static function storeRouteResponse($key, $response) {
98
		self::setKeyExpired ( $key, false );
99
		self::$cache->store ( "controllers/" . $key, $response, 'controllers', false );
100
		return $response;
101
	}
102
103
	private static function getRouteKey($routePath) {
104
		if (is_array ( $routePath )) {
105
			return "path" . \md5 ( \implode ( "", $routePath ) );
106
		}
107
		return "path" . \md5 ( Router::slashPath ( $routePath ) );
108
	}
109
110
	/**
111
	 *
112
	 * @param boolean $isRest
113
	 * @return array
114
	 */
115 55
	public static function getControllerCache($isRest = false) {
116 55
		$key = ($isRest) ? "rest" : "default";
117 55
		if (self::$cache->exists ( "controllers/routes." . $key ))
118 52
			return self::$cache->fetch ( "controllers/routes." . $key );
119 4
		return [ ];
120
	}
121
122
	public static function getRouteCache($routePath, $routeArray, $duration) {
123
		$key = self::getRouteKey ( $routePath );
124
125
		if (self::$cache->exists ( "controllers/" . $key ) && ! self::expired ( $key, $duration )) {
126
			$response = self::$cache->file_get_contents ( "controllers/" . $key );
127
			return $response;
128
		} else {
129
			$response = Startup::runAsString ( $routeArray );
130
			return self::storeRouteResponse ( $key, $response );
131
		}
132
	}
133
134
	protected static function expired($key, $duration) {
135
		return self::$cache->expired ( "controllers/" . $key, $duration ) === true;
136
	}
137
138
	public static function isExpired($routePath, $duration) {
139
		return self::expired ( self::getRouteKey ( $routePath ), $duration );
140
	}
141
142
	public static function setExpired($routePath) {
143
		$key = self::getRouteKey ( $routePath );
144
		if (self::$cache->exists ( "controllers/" . $key )) {
145
			self::$cache->remove ( "controllers/" . $key );
146
		}
147
	}
148
149
	public static function setRouteCache($routePath) {
150
		$key = self::getRouteKey ( $routePath );
151
		$response = Startup::runAsString ( $routePath );
152
		return self::storeRouteResponse ( $key, $response );
153
	}
154
155
	public static function addAdminRoutes() {
156
		self::addControllerCache ( "Ubiquity\controllers\Admin" );
157
	}
158
159 2
	public static function getRoutes() {
160 2
		$result = self::getControllerCache ();
161 2
		return $result;
162
	}
163
164 1
	public static function getControllerRoutes($controllerClass, $isRest = false) {
165 1
		$result = [ ];
166 1
		$ctrlCache = self::getControllerCache ( $isRest );
167 1
		foreach ( $ctrlCache as $path => $routeAttributes ) {
168 1
			if (isset ( $routeAttributes ["controller"] )) {
169 1
				if ($routeAttributes ["controller"] === $controllerClass) {
170 1
					$result [$path] = $routeAttributes;
171
				}
172
			} else {
173 1
				$firstValue = current ( $routeAttributes );
174 1
				if (isset ( $firstValue ) && isset ( $firstValue ["controller"] )) {
175 1
					if ($firstValue ["controller"] === $controllerClass) {
176 1
						$result [$path] = $routeAttributes;
177
					}
178
				}
179
			}
180
		}
181 1
		return $result;
182
	}
183
184 1
	public static function addRoute($path, $controller, $action = "index", $methods = null, $name = "", $isRest = false, $priority = 0, $callback = null) {
185 1
		$controllerCache = self::getControllerCache ( $isRest );
186 1
		Router::addRouteToRoutes ( $controllerCache, $path, $controller, $action, $methods, $name, false, null, [ ], $priority, $callback );
187 1
		self::$cache->store ( 'controllers/routes.' . ($isRest ? 'rest' : 'default'), "return " . UArray::asPhpArray ( $controllerCache, "array" ) . ";", 'controllers' );
188 1
	}
189
190
	public static function addRoutes($pathArray, $controller, $action = "index", $methods = null, $name = "") {
191
		self::addRoutes_ ( $pathArray, $controller, $action, $methods, $name, false );
192
	}
193
194
	public static function addRestRoutes($pathArray, $controller, $action = "index", $methods = null, $name = "") {
195
		self::addRoutes_ ( $pathArray, $controller, $action, $methods, $name, true );
196
	}
197
198
	private static function addRoutes_($pathArray, $controller, $action = "index", $methods = null, $name = "", $isRest = false) {
199
		$controllerCache = self::getControllerCache ( $isRest );
200
		$postfix = "default";
201
		if ($isRest) {
202
			$postfix = "rest";
203
		}
204
		Router::addRoutesToRoutes ( $controllerCache, $pathArray, $controller, $action, $methods, $name );
205
		self::$cache->store ( "controllers/routes." . $postfix, "return " . UArray::asPhpArray ( $controllerCache, "array" ) . ";", 'controllers' );
206
	}
207
208 17
	public static function getControllersFiles(&$config, $silent = false) {
209 17
		return self::_getFiles ( $config, "controllers", $silent );
210
	}
211
212 9
	public static function getControllers($subClass = "\\Ubiquity\\controllers\\Controller", $backslash = false, $includeSubclass = false, $includeAbstract = false) {
213 9
		$result = [ ];
214 9
		if ($includeSubclass) {
215 1
			$result [] = $subClass;
216
		}
217 9
		$config = Startup::getConfig ();
218 9
		$files = self::getControllersFiles ( $config, true );
219
		try {
220 9
			$restCtrls = CacheManager::getRestCache ();
221 2
		} catch ( \Exception $e ) {
222 2
			$restCtrls = [ ];
223
		}
224 9
		foreach ( $files as $file ) {
225 9
			if (is_file ( $file )) {
226 9
				$controllerClass = ClassUtils::getClassFullNameFromFile ( $file, $backslash );
227 9
				if (isset ( $restCtrls [$controllerClass] ) === false) {
228 9
					$r = new \ReflectionClass ( $controllerClass );
229 9
					if ($r->isSubclassOf ( $subClass ) && ($includeAbstract || ! $r->isAbstract ())) {
230 9
						$result [] = $controllerClass;
231
					}
232
				}
233
			}
234
		}
235 9
		return $result;
236
	}
237
}
238