<?php
namespace CW\Router;
use CW\Errors\NiunException;
class Route {
public static $request;
private static $param;
private static $paramArr = [];
public static function run($route_rule = []){
self::$request = $route_rule;
$routes = self::matchURI();
self::_prepareParams($routes);
self::_prepareRoute($routes['controller'], $routes['action']);
}
private static function matchURI($uri = null) {
$uri = (!$uri) ? parse_url($_SERVER['REQUEST_URI']) : $uri;
$uri = ($uri['path'] == '/') ? '/' : rtrim($uri['path'],'\/');
if(!empty(self::$request)) {
$count=count(self::$request);
for($i=0; $i<$count; ++$i) {
foreach(self::$request[$i] as $k => $v) {
if (is_array($v) and $k !== 'param') {
self::$param = self::$request[$i]['param'];
$v['request'] = preg_replace_callback('/\<(?<key>[0-9a-z_]+)\>/',
'self::_replacer',
str_replace(")",")?", $v['request'])
);
$rulleTemp = array_merge((array)self::$request[$i], (array)$v);
if(($t = self::_reportRulle($rulleTemp, $uri)))
return $t;
}
}
}
} else return array();
}
private static function _replacer($matches) {
if(isset(self::$param[$matches['key']])) {
return "(?<".$matches['key'].">".self::$param[$matches['key']].")";
} else return "(?<".$matches['key'].">"."([^/]+)".")";
}
private static function _reportRulle($ini_array, $uri) {
if(is_array($ini_array) and $uri) {
if(preg_match("#^".$ini_array['request']."$#", $uri, $match)){
$r = array_merge((array)$ini_array, (array)$match);
foreach($r as $k => $v)
if((int)$k OR $k == 'param' OR $k == 'request')
unset($r[$k]);
return $r;
}
}
}
/**
* Preparing controller to be included. Checking is controller exists.
* Creating new specific model instance. Creating controller instance.
*
* @param $controller string Controller name.
* @param $method string Method name.
*/
static function _prepareRoute($controller, $action) {
$controller_path = Application . $controller . '/' . $controller . 'Controller.php';
self::_checkControllerExists($controller_path);
self::_createModelInstance($controller);
self::_createInstance($controller, $action);
}
/**
* Checks requested URL on params and id and if exists sets to the private vars.
*
* @param $routes array Requested URL.
*/
static function _prepareParams($routes) {
if ((!empty($routes['lang']) && !empty($routes['pagination']) && !empty($routes['page'])) || !empty($routes['lang']) || !empty($routes['pagination']) || !empty($routes['page'])) {
self::$paramArr['lang'] = $routes['lang'];
self::$paramArr['pagination'] = $routes['pagination'];
self::$paramArr['page'] = $routes['page'];
}
}
/**
* Checks is controller exists and inlcude it.
*
* @param $controller_path string Controller path. Used to include and controller.
* @throws Exception
*/
static function _checkControllerExists($controller_path) {
try {
if (file_exists($controller_path)) {
require_once $controller_path;
} else {
throw new NiunException;
}
} catch (NiunException $e) {
echo $e->getMessage();
}
}
/**
* Creating new instance that required by URL.
*
* @param $controller string Controller name.
* @param $method string Method name.
*/
static function _createInstance($controller, $action) {
$instance = new $controller;
if (method_exists($instance, $action)) {
$reflection = new \ReflectionMethod($instance, $action);
if (!$reflection->isPublic()) {
@header('Location: /');
}
$instance->$action(self::$paramArr);
} else {
@header('Location: /');
}
}
/**
* Creates instance of model by requested controller.
*
* @param $controller string Controller name.
*/
static function _createModelInstance($controller) {
$model = Application . $controller . '/' . $controller . 'Model.php';
if(file_exists($model)) {
require_once ($model);
}
}
}
preferences:
40.25 ms | 402 KiB | 5 Q