Merge branch 'remastering' of https://git.steelants.cz/SImple-Home/PHP_SMART_HOME_V3 into remastering

This commit is contained in:
JonatanRek 2020-04-21 14:11:46 +02:00
commit 15dfc8464d
1 changed files with 86 additions and 82 deletions

View File

@ -1,101 +1,105 @@
<?php <?php
/** /**
* Mini Router * Mini Router
* @author github.com/Xinatorus * @author github.com/Xinatorus
* https://github.com/Xinatorus/MiniRouter * https://github.com/Xinatorus/MiniRouter
*/ */
class Router{ class Router{
private $routes; private $routes;
private $defaultFunction; private $defaultFunction;
private $params; private $params;
private $function; private $function;
public function __construct(){ public function __construct(){
$this->routes = []; $this->routes = [];
$this->function = NULL; $this->function = NULL;
$this->defaultFunction = NULL; $this->defaultFunction = NULL;
$this->params = []; $this->params = [];
} }
public function add($method, $pattern, $function){ public function add($method, $pattern, $function){
$this->routes[] = [ $this->routes[] = [
'method' => $method, 'method' => $method,
'pattern' => $pattern, 'pattern' => $pattern,
'function' => $function, 'function' => $function,
]; ];
} }
public function any($pattern, $function){ public function any($pattern, $function){
$this->add(NULL, $pattern, $function); $this->add(NULL, $pattern, $function);
} }
public function get($pattern, $function){ public function get($pattern, $function){
$this->add('GET', $pattern, $function); $this->add('GET', $pattern, $function);
} }
public function post($pattern, $function){ public function post($pattern, $function){
$this->add('POST', $pattern, $function); $this->add('POST', $pattern, $function);
} }
public function put($pattern, $function){ public function put($pattern, $function){
$this->add('PUT', $pattern, $function); $this->add('PUT', $pattern, $function);
} }
public function patch($pattern, $function){ public function patch($pattern, $function){
$this->add('PATCH', $pattern, $function); $this->add('PATCH', $pattern, $function);
} }
public function delete($pattern, $function){ public function delete($pattern, $function){
$this->add('DELETE', $pattern, $function); $this->add('DELETE', $pattern, $function);
} }
public function setDefault($function){ public function setDefault($function){
$this->defaultFunction = $function; $this->defaultFunction = $function;
} }
public function run($method, $uri){ public function run($method, $uri){
if(!$this->matchRoute($method, $uri)){ if(!$this->matchRoute($method, $uri)){
$this->function = $this->defaultFunction; $this->function = $this->defaultFunction;
} }
if($this->function !== NULL){ if($this->function !== NULL){
if(strpos($this->function, '@') !== false){ if(is_string($this->function)){
list($class, $function) = explode('@', $this->function); if(strpos($this->function, '@') !== false){
$method = new ReflectionMethod($class, $function); list($class, $function) = explode('@', $this->function);
if($method->isStatic()){ $method = new ReflectionMethod($class, $function);
call_user_func_array([$class, $function], $this->params); if($method->isStatic()){
}else{ call_user_func_array([$class, $function], $this->params);
call_user_func_array([new $class, $function], $this->params); }else{
} call_user_func_array([new $class, $function], $this->params);
}else if(class_exists($this->function)){ }
new $this->function(...$this->params); }else if(class_exists($this->function)){
}else if (is_callable($this->function)) { new $this->function(...$this->params);
call_user_func_array($this->function, $this->params); }else if (is_callable($this->function)) {
} call_user_func_array($this->function, $this->params);
} }
} }else if (is_callable($this->function)) {
call_user_func_array($this->function, $this->params);
}
}
}
private function matchRoute($method, $uri){ private function matchRoute($method, $uri){
foreach($this->routes as $route){ foreach($this->routes as $route){
$patternRegex = $this->convertPatternToRegex($route['pattern']); $patternRegex = $this->convertPatternToRegex($route['pattern']);
$params = []; $params = [];
if(($route['method'] === NULL || $route['method'] === $method) && preg_match($patternRegex, $uri, $params)){ if(($route['method'] === NULL || $route['method'] === $method) && preg_match($patternRegex, $uri, $params)){
array_shift($params); array_shift($params);
$this->params = $params; $this->params = $params;
$this->function = $route['function']; $this->function = $route['function'];
return true; return true;
} }
} }
return false; return false;
} }
private function convertPatternToRegex($pattern){ private function convertPatternToRegex($pattern){
$regex = preg_replace('@{\w+}@', '([\w\d\-\.,]+)', $pattern); $regex = preg_replace('@{\w+}@', '([\w\d\-\.,]+)', $pattern);
if ( substr($regex, -1) === '/' ) { if ( substr($regex, -1) === '/' ) {
$regex .= '?'; $regex .= '?';
} }
return '@^' . $regex . '$@'; return '@^' . $regex . '$@';
} }
} }