Что можно улучшить или удалить в данном классе?
Пишу свой маршрутизатор для личной платформы, пока сделал основную часть, сижу и понимаю что сделал не совсем правильно и местами где-то допустил ошибки.
Пример маршрутизации:
try{
$Router->GET("/", function(){
echo "Home page!";
});
$Router->GET("/about/", function(){
echo "About page!";
});
$Router->GET("/about/{username:[0-9a-zA-Z-_]}", function($username){
echo $username;
});
$Router->Run();
}catch(Exception $e){
DebugMaster::ExceptionHandler($e);
}
Сам класс:
<?php
class Router{
private $routes = array();
private $validRoutes = array();
private $boolEndSlash = true;
public function GetRoutes(){
return $this->routes;
}
public function GetValideRoutes(){
return $this->validRoutes;
}
public function Route($METHODS, $URI, $CALLABLE){
$levels = explode("/", $URI);
$string = "/";
$params = array();
foreach ($levels as $level){
if(!empty($level)){
if(preg_match("/{(?<name>.*):(?<regex>.*)}/U", $level, $matches)){
$params["_".$matches["name"]]=$matches["regex"];
$string .= trim("(?<_".$matches["name"]. ">.*)/", ' ');
}else{
$string .= $level."/";
}
}
}
$string = "/".str_replace("/", "\/", $string)."/U";
$this->routes[implode(',', $METHODS).":".$URI] = array(
"METHOD" => $METHODS,
"URI" => $URI,
"REGEX" => $string,
"PARAMS_REGEXES" => $params,
"CALLABLE" => $CALLABLE,
);
}
public function GET($URI, $CALLABLE){
$this->Route(["GET"], $URI, $CALLABLE);
}
public function POST($URI, $CALLABLE){
$this->Route(["POST"], $URI, $CALLABLE);
}
public function Run(){
$REQUEST_METHOD = $_SERVER["REQUEST_METHOD"];
$REQUEST_URI = $_SERVER["REQUEST_URI"];
foreach($this->routes as $name => $route){
$validRoute=$route;
if(isset($this->validRoutes[$name])){
throw new ErrorException("Duplicate route found - ".$name);
}elseif($validRoute["URI"] == $REQUEST_URI){
$this->validRoutes[$name]=$validRoute;
}else{
preg_match($route["REGEX"], $REQUEST_URI, $matches);
if(isset($matches[0])){
$uriParse = $matches[0];
$params = simpleArrayResortNonNumeric($matches);
if($REQUEST_URI == $uriParse){
foreach($params as $param_name => $param_value){
preg_match("/.*".$route["PARAMS_REGEXES"][$param_name]."/", $param_value, $matches);
if(isset($matches[0])){
if($matches[0] == $param_value){
$validRoute["PARAMS"][substr($param_name, 1)]=$param_value;
}else{
throw new ErrorException("BAD REGEX ON PARAM: " . $param_name. " = ". $param_value. " || ".$validRoute["PARAMS_REGEXES"][$param_name]);
}
}else{
throw new ErrorException("BAD REGEX ON PARAM: " . $param_name. " = ". $param_value. " || ".$validRoute["PARAMS_REGEXES"][$param_name]);
}
}
$this->validRoutes[$name]=$validRoute;
}
}
}
}
if(count($this->validRoutes) == 0){
echo "404, page not found";
}elseif(count($this->validRoutes) > 1){
echo "500, bad routes";
}elseif(count($this->validRoutes)==1){
if(isset($this->validRoutes[key($this->validRoutes)]["PARAMS"])){
if(count($this->validRoutes[key($this->validRoutes)]["PARAMS"])>0){
call_user_func_array($this->validRoutes[key($this->validRoutes)]["CALLABLE"], $this->validRoutes[key($this->validRoutes)]["PARAMS"]);
}else{
call_user_func($this->validRoutes[key($this->validRoutes)]["CALLABLE"]);
}
}else{
call_user_func($this->validRoutes[key($this->validRoutes)]["CALLABLE"]);
}
}
}
}
?>
Добавлять HTTP-методы и методы для работы с API буду позже, сейчас просто хочу довести до ума.