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

RouterCacheTrait::sortByPriority()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 3
dl 0
loc 5
ccs 4
cts 4
cp 1
rs 10
c 1
b 0
f 0
cc 1
nc 1
nop 1
crap 1
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