Test Failed
Push — master ( 588dda...e10d69 )
by Jean-Christophe
07:32
created

RouterCacheTrait::getControllerRoutes()   B

Complexity

Conditions 7
Paths 6

Size

Total Lines 18
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 7.6024

Importance

Changes 0
Metric Value
eloc 12
dl 0
loc 18
ccs 10
cts 13
cp 0.7692
rs 8.8333
c 0
b 0
f 0
cc 7
nc 6
nop 2
crap 7.6024
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
12
/**
13
 *
14
 * @author jcheron <[email protected]>
15
 * @version 1.0.3
16
 * @property \Ubiquity\cache\system\AbstractDataCache $cache
17
 *
18
 */
19
trait RouterCacheTrait {
20
21
	abstract protected static function _getFiles(&$config, $type, $silent = false);
22
23
	private static function addControllerCache($classname) {
24
		$parser = new ControllerParser ();
25
		try {
26
			$parser->parse ( $classname );
27
			return $parser->asArray ();
28
		} catch ( \Exception $e ) {
29
			// Nothing to do
30
		}
31
		return [ ];
32
	}
33
34
	private static function initRouterCache(&$config, $silent = false) {
35
		$routes = [ "rest" => [ ],"default" => [ ] ];
36 2
		$files = self::getControllersFiles ( $config, $silent );
37 2
		foreach ( $files as $file ) {
38 2
			if (is_file ( $file )) {
39 2
				$controller = ClassUtils::getClassFullNameFromFile ( $file );
40 2
				$parser = new ControllerParser ();
41 2
				try {
42 2
					$parser->parse ( $controller );
43
					$ret = $parser->asArray ();
44 2
					$key = ($parser->isRest ()) ? "rest" : "default";
45 2
					$routes [$key] = \array_merge ( $routes [$key], $ret );
46 2
				} catch ( \Exception $e ) {
47 2
					// Nothing to do
48 1
				}
49
			}
50
		}
51
		self::$cache->store ( "controllers/routes.default", "return " . UArray::asPhpArray ( $routes ["default"], "array" ) . ";", 'controllers' );
52
		self::$cache->store ( "controllers/routes.rest", "return " . UArray::asPhpArray ( $routes ["rest"], "array" ) . ";", 'controllers' );
53 2
		if (! $silent) {
54 2
			echo "Router cache reset\n";
55 2
		}
56 2
	}
57
58 2
	private static function storeRouteResponse($key, $response) {
59
		self::setKeyExpired ( $key, false );
60
		self::$cache->store ( "controllers/" . $key, $response, 'controllers', false );
61
		return $response;
62
	}
63
64
	private static function getRouteKey($routePath) {
65
		if (is_array ( $routePath )) {
66
			return "path" . \md5 ( \implode ( "", $routePath ) );
67
		}
68
		return "path" . \md5 ( Router::slashPath ( $routePath ) );
69
	}
70
71
	/**
72
	 *
73
	 * @param boolean $isRest
74
	 * @return array
75
	 */
76
	public static function getControllerCache($isRest = false) {
77
		$key = ($isRest) ? "rest" : "default";
78
		if (self::$cache->exists ( "controllers/routes." . $key ))
79
			return self::$cache->fetch ( "controllers/routes." . $key );
80
		return [ ];
81
	}
82
83 35
	public static function getRouteCache($routePath, $routeArray, $duration) {
84 35
		$key = self::getRouteKey ( $routePath );
85 35
86 32
		if (self::$cache->exists ( "controllers/" . $key ) && ! self::expired ( $key, $duration )) {
87 4
			$response = self::$cache->file_get_contents ( "controllers/" . $key );
88
			return $response;
89
		} else {
90
			$response = Startup::runAsString ( $routeArray );
91
			return self::storeRouteResponse ( $key, $response );
92
		}
93
	}
94
95
	protected static function expired($key, $duration) {
96
		return self::$cache->expired ( "controllers/" . $key, $duration ) === true;
97
	}
98
99
	public static function isExpired($routePath, $duration) {
100
		return self::expired ( self::getRouteKey ( $routePath ), $duration );
101
	}
102
103
	public static function setExpired($routePath) {
104
		$key = self::getRouteKey ( $routePath );
105
		if (self::$cache->exists ( "controllers/" . $key )) {
106
			self::$cache->remove ( "controllers/" . $key );
107
		}
108
	}
109
110
	public static function setRouteCache($routePath) {
111
		$key = self::getRouteKey ( $routePath );
112
		$response = Startup::runAsString ( $routePath );
113
		return self::storeRouteResponse ( $key, $response );
114
	}
115
116
	public static function addAdminRoutes() {
117
		self::addControllerCache ( "Ubiquity\controllers\Admin" );
118
	}
119
120
	public static function getRoutes() {
121
		$result = self::getControllerCache ();
122
		return $result;
123
	}
124
125
	public static function getControllerRoutes($controllerClass, $isRest = false) {
126
		$result = [ ];
127
		$ctrlCache = self::getControllerCache ( $isRest );
128
		foreach ( $ctrlCache as $path => $routeAttributes ) {
129 2
			if (isset ( $routeAttributes ["controller"] )) {
130 2
				if ($routeAttributes ["controller"] === $controllerClass) {
131 2
					$result [$path] = $routeAttributes;
132
				}
133
			} else {
134 1
				$firstValue = current ( $routeAttributes );
135 1
				if (isset ( $firstValue ) && isset ( $firstValue ["controller"] )) {
136 1
					if ($firstValue ["controller"] === $controllerClass) {
137 1
						$result [$path] = $routeAttributes;
138 1
					}
139 1
				}
140 1
			}
141
		}
142
		return $result;
143 1
	}
144 1
145 1
	public static function addRoute($path, $controller, $action = "index", $methods = null, $name = "") {
146 1
		$controllerCache = self::getControllerCache ();
147
		Router::addRouteToRoutes ( $controllerCache, $path, $controller, $action, $methods, $name );
148
		self::$cache->store ( "controllers/routes.default", "return " . UArray::asPhpArray ( $controllerCache, "array" ) . ";", 'controllers' );
149
	}
150
151 1
	public static function addRoutes($pathArray, $controller, $action = "index", $methods = null, $name = "") {
152
		self::addRoutes_ ( $pathArray, $controller, $action, $methods, $name, false );
153
	}
154
155
	public static function addRestRoutes($pathArray, $controller, $action = "index", $methods = null, $name = "") {
156
		self::addRoutes_ ( $pathArray, $controller, $action, $methods, $name, true );
157
	}
158
159
	private static function addRoutes_($pathArray, $controller, $action = "index", $methods = null, $name = "", $isRest = false) {
160
		$controllerCache = self::getControllerCache ( $isRest );
161
		$postfix = "default";
162
		if ($isRest) {
163
			$postfix = "rest";
164
		}
165
		Router::addRoutesToRoutes ( $controllerCache, $pathArray, $controller, $action, $methods, $name );
166
		self::$cache->store ( "controllers/routes." . $postfix, "return " . UArray::asPhpArray ( $controllerCache, "array" ) . ";", 'controllers' );
167
	}
168
169
	public static function getControllersFiles(&$config, $silent = false) {
170
		return self::_getFiles ( $config, "controllers", $silent );
171
	}
172
173
	public static function getControllers($subClass = "\\Ubiquity\\controllers\\Controller", $backslash = false, $includeSubclass = false) {
174
		$result = [ ];
175
		if ($includeSubclass) {
176
			$result [] = $subClass;
177
		}
178
		$config = Startup::getConfig ();
179
		$files = self::getControllersFiles ( $config, true );
180
		try {
181 4
			$restCtrls = CacheManager::getRestCache ();
182 4
		} catch ( \Exception $e ) {
183
			$restCtrls = [ ];
184
		}
185 2
		foreach ( $files as $file ) {
186 2
			if (is_file ( $file )) {
187 2
				$controllerClass = ClassUtils::getClassFullNameFromFile ( $file, $backslash );
188
				if (isset ( $restCtrls [$controllerClass] ) === false) {
189
					$r = new \ReflectionClass ( $controllerClass );
190 2
					if ($r->isSubclassOf ( $subClass ) && ! $r->isAbstract ()) {
191 2
						$result [] = $controllerClass;
192
					}
193 2
				}
194 1
			}
195 1
		}
196
		return $result;
197 2
	}
198
}
199