Completed
Push — master ( b5f91d...d46a17 )
by Jean-Christophe
01:26
created

RouterCacheTrait::storeRouteResponse()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 5
rs 9.4285
cc 1
eloc 4
nc 1
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
use micro\cache\CacheManager;
10
11
/**
12
 * @author jc
13
 * @staticvar array $cache
14
 *
15
 */
16
trait RouterCacheTrait{
17
	abstract protected static function _getFiles(&$config,$type,$silent=false);
18
	private static $expiredRoutes=[ ];
19
20
	private static function addControllerCache($classname) {
21
		$parser=new ControllerParser();
22
		try {
23
			$parser->parse($classname);
24
			return $parser->asArray();
25
		} catch ( \Exception $e ) {
26
			// Nothing to do
27
		}
28
		return [];
29
	}
30
31
	private static function initRouterCache(&$config,$silent=false) {
32
		$routes=["rest"=>[],"default"=>[]];
33
		$files=self::getControllersFiles($config);
34
		foreach ( $files as $file ) {
35
			if (is_file($file)) {
36
				$controller=ClassUtils::getClassFullNameFromFile($file);
37
				$parser=new ControllerParser();
38
				try {
39
					$parser->parse($controller);
40
					$ret= $parser->asArray();
41
					$key=($parser->isRest())?"rest":"default";
42
					$routes[$key]=\array_merge($routes[$key], $ret);
43
				} catch ( \Exception $e ) {
44
					// Nothing to do
45
				}
46
47
			}
48
		}
49
		self::$cache->store("controllers/routes.default", "return " . JArray::asPhpArray($routes["default"], "array") . ";",'controllers');
50
		self::$cache->store("controllers/routes.rest", "return " . JArray::asPhpArray($routes["rest"], "array") . ";",'controllers');
51
		if(!$silent){
52
			echo "Router cache reset\n";
53
		}
54
	}
55
56
	private static function storeRouteResponse($key, $response) {
57
		self::setKeyExpired($key, false);
58
		self::$cache->store("controllers/" . $key, $response, 'controllers',false);
59
		return $response;
60
	}
61
62
	private static function getRouteKey($routePath) {
63
		return "path" . \md5(\implode("", $routePath));
64
	}
65
66
	private static function setKeyExpired($key, $expired=true) {
67
		if ($expired) {
68
			self::$expiredRoutes[$key]=true;
69
		} else {
70
			unset(self::$expiredRoutes[$key]);
71
		}
72
	}
73
74
	public static function getControllerCache($isRest=false) {
75
		$key=($isRest)?"rest":"default";
76
		if (self::$cache->exists("controllers/routes.".$key))
77
			return self::$cache->fetch("controllers/routes.".$key);
78
		return [];
79
	}
80
81
	public static function getRouteCache($routePath, $duration) {
82
		$key=self::getRouteKey($routePath);
83
84
		if (self::$cache->exists("controllers/" . $key) && !self::expired($key, $duration)) {
85
			$response=self::$cache->file_get_contents("controllers/" . $key);
86
			return $response;
87
		} else {
88
			$response=Startup::runAsString($routePath);
89
			return self::storeRouteResponse($key, $response);
90
		}
91
	}
92
93
	public static function expired($key, $duration) {
94
		return self::$cache->expired("controllers/" . $key, $duration) === true || \array_key_exists($key, self::$expiredRoutes);
95
	}
96
97
	public static function isExpired($path,$duration){
98
		$route=Router::getRoute($path,false);
99
		if($route!==false && \is_array($route)){
100
			return self::expired(self::getRouteKey($route), $duration);
101
		}
102
		return true;
103
	}
104
105
	public static function setExpired($routePath, $expired=true) {
106
		$key=self::getRouteKey($routePath);
107
		self::setKeyExpired($key, $expired);
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("micro\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
			if(isset($routeAttributes["controller"])){
130
				if($routeAttributes["controller"]===$controllerClass){
131
					$result[$path]=$routeAttributes;
132
				}
133
			}else{
134
				$firstValue=reset($routeAttributes);
135
				if(isset($firstValue)&&isset($firstValue["controller"])){
136
					if($firstValue["controller"]===$controllerClass){
137
						$result[$path]=$routeAttributes;
138
					}
139
				}
140
			}
141
		}
142
		return $result;
143
	}
144
145
	public static function addRoute($path, $controller, $action="index", $methods=null, $name="") {
146
		$controllerCache=self::getControllerCache();
147
		Router::addRouteToRoutes($controllerCache, $path, $controller, $action, $methods, $name);
148
		self::$cache->store("controllers/routes", "return " . JArray::asPhpArray($controllerCache, "array") . ";",'controllers');
149
	}
150
151
	public static function getControllersFiles(&$config,$silent=false){
152
		return self::_getFiles($config, "controllers",$silent);
153
	}
154
155
	public static function getControllers(){
156
		$result=[];
157
		$config=Startup::getConfig();
158
		$files=self::getControllersFiles($config,true);
159
		try {
160
			$restCtrls=CacheManager::getRestCache();
161
		} catch (\Exception $e) {
162
			$restCtrls=[];
163
		}
164
		foreach ( $files as $file ) {
165
			if (is_file($file)) {
166
				$controllerClass=ClassUtils::getClassFullNameFromFile($file);
167
				if(isset($restCtrls[$controllerClass])===false){
168
					$result[]=$controllerClass;
169
				}
170
			}
171
		}
172
		return $result;
173
	}
174
175
}
176