Completed
Push — master ( 7c92dc...c428b0 )
by Jean-Christophe
01:30
created

RouterCacheTrait::getControllerRoutes()   B

Complexity

Conditions 7
Paths 6

Size

Total Lines 19
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 19
rs 8.2222
cc 7
eloc 13
nc 6
nop 2
1
<?php
2
namespace micro\cache\traits;
3
4
use micro\controllers\Startup;
5
use micro\controllers\Router;
6
use micro\cache\parser\ControllerParser;
7
use micro\cache\ClassUtils;
8
use micro\utils\JArray;
9
10
/**
11
 * @author jc
12
 * @staticvar array $cache
13
 *
14
 */
15
trait RouterCacheTrait{
16
17
	private static $expiredRoutes=[ ];
18
19
	private static function addControllerCache($classname) {
20
		$parser=new ControllerParser();
21
		try {
22
			$parser->parse($classname);
23
			return $parser->asArray();
24
		} catch ( \Exception $e ) {
25
			// Nothing to do
26
		}
27
		return [];
28
	}
29
30
	private static function initRouterCache(&$config,$silent=false) {
31
		$routes=["rest"=>[],"default"=>[]];
32
		$files=self::getControllersFiles($config);
33
		foreach ( $files as $file ) {
34
			if (is_file($file)) {
35
				$controller=ClassUtils::getClassFullNameFromFile($file);
36
				$parser=new ControllerParser();
37
				try {
38
					$parser->parse($controller);
39
					$ret= $parser->asArray();
40
					$key=($parser->isRest())?"rest":"default";
41
					$routes[$key]=\array_merge($routes[$key], $ret);
42
				} catch ( \Exception $e ) {
43
					// Nothing to do
44
				}
45
46
			}
47
		}
48
		self::$cache->store("controllers/routes.default", "return " . JArray::asPhpArray($routes["default"], "array") . ";");
49
		self::$cache->store("controllers/routes.rest", "return " . JArray::asPhpArray($routes["rest"], "array") . ";");
50
		if(!$silent){
51
			echo "Router cache reset\n";
52
		}
53
	}
54
55
	private static function storeRouteResponse($key, $response) {
56
		self::setKeyExpired($key, false);
57
		self::$cache->store("controllers/" . $key, $response, false);
58
		return $response;
59
	}
60
61
	private static function getRouteKey($routePath) {
62
		return "path" . \md5(\implode("", $routePath));
63
	}
64
65
	private static function setKeyExpired($key, $expired=true) {
66
		if ($expired) {
67
			self::$expiredRoutes[$key]=true;
68
		} else {
69
			unset(self::$expiredRoutes[$key]);
70
		}
71
	}
72
73
	public static function getControllerCache($isRest=false) {
74
		$key=($isRest)?"rest":"default";
75
		if (self::$cache->exists("controllers/routes.".$key))
76
			return self::$cache->fetch("controllers/routes.".$key);
77
			return [];
78
	}
79
80
	public static function getRouteCache($routePath, $duration) {
81
		$key=self::getRouteKey($routePath);
82
83
		if (self::$cache->exists("controllers/" . $key) && !self::expired($key, $duration)) {
84
			$response=self::$cache->file_get_contents("controllers/" . $key);
85
			return $response;
86
		} else {
87
			$response=Startup::runAsString($routePath);
88
			return self::storeRouteResponse($key, $response);
89
		}
90
	}
91
92
	public static function expired($key, $duration) {
93
		return self::$cache->expired("controllers/" . $key, $duration) === true || \array_key_exists($key, self::$expiredRoutes);
94
	}
95
96
	public static function isExpired($path,$duration){
97
		$route=Router::getRoute($path,false);
98
		if($route!==false && \is_array($route)){
99
			return self::expired(self::getRouteKey($route), $duration);
100
		}
101
		return true;
102
	}
103
104
	public static function setExpired($routePath, $expired=true) {
105
		$key=self::getRouteKey($routePath);
106
		self::setKeyExpired($key, $expired);
107
	}
108
109
	public static function setRouteCache($routePath) {
110
		$key=self::getRouteKey($routePath);
111
		$response=Startup::runAsString($routePath);
112
		return self::storeRouteResponse($key, $response);
113
	}
114
115
	public static function addAdminRoutes() {
116
		self::addControllerCache("micro\controllers\Admin");
117
	}
118
119
	public static function getRoutes() {
120
		$result=self::getControllerCache();
121
		return $result;
122
	}
123
124
	public static function getControllerRoutes($controllerClass,$isRest=false){
125
		$result=[];
126
		$ctrlCache=self::getControllerCache($isRest);
127
		foreach ($ctrlCache as $path=>$routeAttributes){
128
			if(isset($routeAttributes["controller"])){
129
				if($routeAttributes["controller"]===$controllerClass){
130
					$result[$path]=$routeAttributes;
131
				}
132
			}else{
133
				$firstValue=reset($routeAttributes);
134
				if(isset($firstValue)&&isset($firstValue["controller"])){
135
					if($firstValue["controller"]===$controllerClass){
136
						$result[$path]=$routeAttributes;
137
					}
138
				}
139
			}
140
		}
141
		return $result;
142
	}
143
144
	public static function addRoute($path, $controller, $action="index", $methods=null, $name="") {
145
		$controllerCache=self::getControllerCache();
146
		Router::addRouteToRoutes($controllerCache, $path, $controller, $action, $methods, $name);
147
		self::$cache->store("controllers/routes", "return " . JArray::asPhpArray($controllerCache, "array") . ";");
148
	}
149
150
	public static function getControllersFiles(&$config,$silent=false){
151
		return self::_getFiles($config, "controllers",$silent);
152
	}
153
154
}
155