<?php
namespace elanpl\L3;
define('_L3_ROUTE_404_NAME', '_L3_404');
class Router{
protected $routes;
protected $routeNameIndex;
public $parsedParameters;
public $depth;
public $routeInfo;
public function __construct($routing)
{
$this->routes = array();
$this->routeNameIndex = array();
$routing->set($this);
}
public function add($method, $path, $result, $name = ''){
$this->routes[] = new RouteInfo($method, $path, $result, $name);
if(isset($name)&&$name!='') $this->routeNameIndex[$name] = &$this->routes[count($this->routes)-1];
return $this;
}
public function add404($result){
return $this->add('404', '', $result, _L3_ROUTE_404_NAME);
}
public function get($path, $result, $name = ''){
return $this->add('GET', $path, $result, $name);
}
public function post($path, $result, $name = ''){
return $this->add('POST', $path, $result, $name);
}
public function put($path, $result, $name = ''){
return $this->add('PUT', $path, $result, $name);
}
public function patch($path, $result, $name = ''){
return $this->add('PATCH', $path, $result, $name);
}
public function delete($path, $result, $name = ''){
return $this->add('DELETE', $path, $result, $name);
}
public function any($path, $result, $name = ''){
return $this->add('ANY', $path, $result, $name);
}
public function addBeforeAction($event_handler){
$this->routes[count($this->routes)-1]->addBeforeAction($event_handler);
return $this;
}
public function addAfterAction($event_handler){
$this->routes[count($this->routes)-1]->addAfterAction($event_handler);
return $this;
}
public function addAfterResult($event_handler){
$this->routes[count($this->routes)-1]->addAfterAction($event_handler);
return $this;
}
public function match($request){
$auri = explode('/', trim($request->path, "/ \t\n\r\0\x0B"));
$curi = count($auri);
foreach ($this->routes as $routeInfo) {
$route = $routeInfo->path;
$method = $routeInfo->method;
if($method=='ANY' || strpos($request->method,$method)!==false){
$aroute = explode('/', trim($route, "/ \t\n\r\0\x0B"));
if($curi==count($aroute)){
$matchResult = true;
for($i = 0; $i<$curi; $i++){
$pathPartName = trim($aroute[$i],'{}');
if($aroute[$i]==$pathPartName){
if($auri[$i]!=$pathPartName){
$matchResult = false;
break;
}
}
else{
$value = $auri[$i];
$valueKey = explode(':', $pathPartName);
if(isset($valueKey[1]) && $valueKey[1]=='int'){
$value = intval($value);
}
$this->parsedParameters[$valueKey[0]] = $value;