Passed
Push — master ( 5c03cc...d5672a )
by Jean-Christophe
09:14
created

RouterCacheTrait::addRoute()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 4
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
eloc 3
dl 0
loc 4
ccs 0
cts 4
cp 0
rs 10
c 0
b 0
f 0
cc 2
nc 1
nop 8
crap 6

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

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 16
	private static function parseControllerFiles(&$config, $silent = false) {
39 16
		$routes = [ "rest" => [ ],"default" => [ ] ];
40 16
		$files = self::getControllersFiles ( $config, $silent );
41 16
		foreach ( $files as $file ) {
42 16
			if (is_file ( $file )) {
43 16
				$controller = ClassUtils::getClassFullNameFromFile ( $file );
44 16
				$parser = new ControllerParser ();
45
				try {
46 16
					$parser->parse ( $controller );
47 16
					$ret = $parser->asArray ();
48 16
					$key = ($parser->isRest ()) ? "rest" : "default";
49 16
					$routes [$key] = \array_merge ( $routes [$key], $ret );
50 1
				} catch ( \Exception $e ) {
51
					// Nothing to do
52
				}
53
			}
54
		}
55 16
		self::sortByPriority ( $routes ['default'] );
56 16
		self::sortByPriority ( $routes ['rest'] );
57 16
		return $routes;
58
	}
59
60 16
	protected static function sortByPriority(&$array) {
61
		uasort ( $array, function ($item1, $item2) {
62 16
			return UArray::getRecursive ( $item2, "priority", 0 ) <=> UArray::getRecursive ( $item1, "priority", 0 );
63 16
		} );
64 16
		UArray::removeRecursive ( $array, "priority" );
65 16
	}
66
67 6
	private static function initRouterCache(&$config, $silent = false) {
68 6
		$routes = self::parseControllerFiles ( $config, $silent );
69 6
		self::$cache->store ( "controllers/routes.default", "return " . UArray::asPhpArray ( $routes ["default"], "array" ) . ";", 'controllers' );
70 6
		self::$cache->store ( "controllers/routes.rest", "return " . UArray::asPhpArray ( $routes ["rest"], "array" ) . ";", 'controllers' );
71 6
		DiManager::init ( $config );
72 5
		if (! $silent) {
73 5
			echo "Router cache reset\n";
74
		}
75 5
	}
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 54
	public static function getControllerCache($isRest = false) {
116 54
		$key = ($isRest) ? "rest" : "default";
117 54
		if (self::$cache->exists ( "controllers/routes." . $key ))
118 51
			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
	public static function addRoute($path, $controller, $action = "index", $methods = null, $name = "", $isRest = false, $priority = 0, $callback = null) {
185
		$controllerCache = self::getControllerCache ( $isRest );
186
		Router::addRouteToRoutes ( $controllerCache, $path, $controller, $action, $methods, $name, false, null, [ ], $priority, $callback );
187
		self::$cache->store ( 'controllers/routes.' . ($isRest ? 'rest' : 'default'), "return " . UArray::asPhpArray ( $controllerCache, "array" ) . ";", 'controllers' );
188
	}
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 16
	public static function getControllersFiles(&$config, $silent = false) {
209 16
		return self::_getFiles ( $config, "controllers", $silent );
210
	}
211
212 8
	public static function getControllers($subClass = "\\Ubiquity\\controllers\\Controller", $backslash = false, $includeSubclass = false, $includeAbstract = false) {
213 8
		$result = [ ];
214 8
		if ($includeSubclass) {
215 1
			$result [] = $subClass;
216
		}
217 8
		$config = Startup::getConfig ();
218 8
		$files = self::getControllersFiles ( $config, true );
219
		try {
220 8
			$restCtrls = CacheManager::getRestCache ();
221 2
		} catch ( \Exception $e ) {
222 2
			$restCtrls = [ ];
223
		}
224 8
		foreach ( $files as $file ) {
225 8
			if (is_file ( $file )) {
226 8
				$controllerClass = ClassUtils::getClassFullNameFromFile ( $file, $backslash );
227 8
				if (isset ( $restCtrls [$controllerClass] ) === false) {
228 8
					$r = new \ReflectionClass ( $controllerClass );
229 8
					if ($r->isSubclassOf ( $subClass ) && ($includeAbstract || ! $r->isAbstract ())) {
230 8
						$result [] = $controllerClass;
231
					}
232
				}
233
			}
234
		}
235 8
		return $result;
236
	}
237
}
238