Ubiquity  2.0.0
php rapid development framework
RouterCacheTrait.php
Go to the documentation of this file.
1 <?php
2 
3 namespace Ubiquity\cache\traits;
4 
11 
19 
20  abstract protected static function _getFiles(&$config, $type, $silent=false);
21  private static $expiredRoutes=[ ];
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  $files=self::getControllersFiles($config);
37  foreach ( $files as $file ) {
38  if (is_file($file)) {
39  $controller=ClassUtils::getClassFullNameFromFile($file);
40  $parser=new ControllerParser();
41  try {
42  $parser->parse($controller);
43  $ret=$parser->asArray();
44  $key=($parser->isRest()) ? "rest" : "default";
45  $routes[$key]=\array_merge($routes[$key], $ret);
46  } catch ( \Exception $e ) {
47  // Nothing to do
48  }
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  if (!$silent) {
54  echo "Router cache reset\n";
55  }
56  }
57 
58  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  return "path" . \md5(\implode("", $routePath));
66  }
67 
68  private static function setKeyExpired($key, $expired=true) {
69  if ($expired) {
70  self::$expiredRoutes[$key]=true;
71  } else {
72  unset(self::$expiredRoutes[$key]);
73  }
74  }
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  public static function getRouteCache($routePath, $duration) {
84  $key=self::getRouteKey($routePath);
85 
86  if (self::$cache->exists("controllers/" . $key) && !self::expired($key, $duration)) {
87  $response=self::$cache->file_get_contents("controllers/" . $key);
88  return $response;
89  } else {
90  $response=Startup::runAsString($routePath);
91  return self::storeRouteResponse($key, $response);
92  }
93  }
94 
95  public static function expired($key, $duration) {
96  return self::$cache->expired("controllers/" . $key, $duration) === true || \array_key_exists($key, self::$expiredRoutes);
97  }
98 
99  public static function isExpired($path, $duration) {
100  $route=Router::getRoute($path, false);
101  if ($route !== false && \is_array($route)) {
102  return self::expired(self::getRouteKey($route), $duration);
103  }
104  return true;
105  }
106 
107  public static function setExpired($routePath, $expired=true) {
108  $key=self::getRouteKey($routePath);
109  self::setKeyExpired($key, $expired);
110  }
111 
112  public static function setRouteCache($routePath) {
113  $key=self::getRouteKey($routePath);
114  $response=Startup::runAsString($routePath);
115  return self::storeRouteResponse($key, $response);
116  }
117 
118  public static function addAdminRoutes() {
119  self::addControllerCache("Ubiquity\controllers\Admin");
120  }
121 
122  public static function getRoutes() {
123  $result=self::getControllerCache();
124  return $result;
125  }
126 
127  public static function getControllerRoutes($controllerClass, $isRest=false) {
128  $result=[ ];
129  $ctrlCache=self::getControllerCache($isRest);
130  foreach ( $ctrlCache as $path => $routeAttributes ) {
131  if (isset($routeAttributes["controller"])) {
132  if ($routeAttributes["controller"] === $controllerClass) {
133  $result[$path]=$routeAttributes;
134  }
135  } else {
136  $firstValue=reset($routeAttributes);
137  if (isset($firstValue) && isset($firstValue["controller"])) {
138  if ($firstValue["controller"] === $controllerClass) {
139  $result[$path]=$routeAttributes;
140  }
141  }
142  }
143  }
144  return $result;
145  }
146 
147  public static function addRoute($path, $controller, $action="index", $methods=null, $name="") {
148  $controllerCache=self::getControllerCache();
149  Router::addRouteToRoutes($controllerCache, $path, $controller, $action, $methods, $name);
150  self::$cache->store("controllers/routes", "return " . UArray::asPhpArray($controllerCache, "array") . ";", 'controllers');
151  }
152 
153  public static function getControllersFiles(&$config, $silent=false) {
154  return self::_getFiles($config, "controllers", $silent);
155  }
156 
157  public static function getControllers() {
158  $result=[ ];
159  $config=Startup::getConfig();
160  $files=self::getControllersFiles($config, true);
161  try {
162  $restCtrls=CacheManager::getRestCache();
163  } catch ( \Exception $e ) {
164  $restCtrls=[ ];
165  }
166  foreach ( $files as $file ) {
167  if (is_file($file)) {
168  $controllerClass=ClassUtils::getClassFullNameFromFile($file);
169  if (isset($restCtrls[$controllerClass]) === false) {
170  $result[]=$controllerClass;
171  }
172  }
173  }
174  return $result;
175  }
176 }
static initRouterCache(&$config, $silent=false)
static getClassFullNameFromFile($filePathName)
get the full name (name \ namespace) of a class from its file path result example: (string) "I\Am\The...
Definition: ClassUtils.php:15
static storeRouteResponse($key, $response)
static runAsString($u, $initialize=true, $finalize=true)
Definition: Startup.php:115
static setExpired($routePath, $expired=true)
static asPhpArray($array, $prefix="")
Definition: UArray.php:27
static addRouteToRoutes(&$routesArray, $path, $controller, $action="index", $methods=null, $name="", $cache=false, $duration=null, $requirements=[])
Definition: Router.php:218
static setKeyExpired($key, $expired=true)
static getRoute($path, $cachedResponse=true)
Definition: Router.php:34
static addRoute($path, $controller, $action="index", $methods=null, $name="")
static getRouteCache($routePath, $duration)
static getControllersFiles(&$config, $silent=false)
static getControllerRoutes($controllerClass, $isRest=false)
static _getFiles(&$config, $type, $silent=false)