Есть небольшой класс реализующий маршрутизацию в приложении.
namespace http;
class Router{
private $routes=[];
private $args=[];
private $wildcards=['/{id}/'=>'([0-9]+)','/{name}/'=>'(.+)'];
private $requestedUri;
public function get($route, callable $callback){
$this->routes['GET'][$route]=$callback;
}
public function post($route, callable $callback){
$this->routes['POST'][$route]=$callback;
}
private function dispatch(){
$uri = reset(explode('?', $_SERVER["REQUEST_URI"]));
$this->requestedUri = empty(urldecode(rtrim($uri, '/')))? '/':urldecode(rtrim($uri, '/'));
$callback=$this->routes[$_SERVER['REQUEST_METHOD']][$this->requestedUri];
if(is_callable($callback)){
return $this->execute($callback);
}
foreach($this->routes[$_SERVER['REQUEST_METHOD']] as $route=>$callback){
if($route==='/'){continue;}
$pattern=preg_replace(array_keys($this->wildcards), $this->wildcards, $route);
if(preg_match('~'.$pattern.'~',$this->requestedUri)===1){
$this->args=array_diff(explode('/',$this->requestedUri),explode('/',$pattern));
return $this->execute($callback);
}
}
}
private function execute(callable $callback){
return call_user_func_array($callback,$this->args);
}
public function run(){
return $this->dispatch();
}
}
$router=new \http\Router();
$router->get('/path/{id}/self/{name}', function($id, $name){echo 'id : '.$id.'
name : '.$name;}); Пример использования роутера с функцией-замыканием.
Хотелось бы услышать мнение общественности. Что следует изменить, что добавить. Или может быть вовсе не делать так.