Changing name

This commit is contained in:
2019-04-05 20:06:37 -03:00
parent 490f52f1cc
commit 8636787b83
3 changed files with 6 additions and 6 deletions
+283
View File
@@ -0,0 +1,283 @@
<?php
namespace Routes;
/*
*
*/
class Route {
/*
* HTTP VERB
*/
public $_verb = Array();
/*
* Execution Source
* HTTP | Cli | SOAP |
*/
public $_source;
/*
* URI String
*/
public $_uri;
/*
* Routes dispatch priority
*/
public $_weight = 0;
/*
* URI Segments
*/
public $_uri_segments = Array();
/*
* Extracted params
*/
public $_segments = Array();
/*
* Prepared params
*/
public $_params = Array();
/*
* Execute before dispatch route
*/
public $_before = Array();
/*
* Route callback
*/
public $_callback = Array();
/*
* Execute after route dispatched
*/
public $_after = Array();
/*
* Prepared RegEx
*/
public $_regex = '';
/*
* Can execute other route after this one?
*/
public $_block = false;
/*
* Is there a problem witch one?
*/
public $_http_error = false;
/*
* This rout should be counted?
*/
public $_ignore = false;
/*
* Middlewares to remove from the list
*/
public $_middlewares_to_ignore = Array();
/*
* From Klein
* HTTP status List
*/
protected static $http_messages = array(
// Informational 1xx
100 => 'Continue',
101 => 'Switching Protocols',
// Successful 2xx
200 => 'OK',
201 => 'Created',
202 => 'Accepted',
203 => 'Non-Authoritative Information',
204 => 'No Content',
205 => 'Reset Content',
206 => 'Partial Content',
// Redirection 3xx
300 => 'Multiple Choices',
301 => 'Moved Permanently',
302 => 'Found',
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
306 => '(Unused)',
307 => 'Temporary Redirect',
// Client Error 4xx
400 => 'Bad Request',
401 => 'Unauthorized',
402 => 'Payment Required',
403 => 'Forbidden',
404 => 'Not Found',
405 => 'Method Not Allowed',
406 => 'Not Acceptable',
407 => 'Proxy Authentication Required',
408 => 'Request Timeout',
409 => 'Conflict',
410 => 'Gone',
411 => 'Length Required',
412 => 'Precondition Failed',
413 => 'Request Entity Too Large',
414 => 'Request-URI Too Long',
415 => 'Unsupported Media Type',
416 => 'Requested Range Not Satisfiable',
417 => 'Expectation Failed',
// Server Error 5xx
500 => 'Internal Server Error',
501 => 'Not Implemented',
502 => 'Bad Gateway',
503 => 'Service Unavailable',
504 => 'Gateway Timeout',
505 => 'HTTP Version Not Supported',
);
//=======================================================
function execute() {
foreach ($this->_before as $key => $before) {
if (!in_array($key, $this->_middlewares_to_ignore) && !$this->_ignore) {
call_user_func($before);
}
}
foreach ($this->_callback as $callback) {
if (is_string($callback)) {
$segments = explode('@', $callback);
$class = new $segments[0]();
$r = new \ReflectionMethod($segments[0], $segments[1]);
if (sizeof($r->getParameters()) > 0 && $r->getParameters()[0]->getClass() != NULL) {
$element;
$element = $r->getParameters()[0]->getClass()->name;
$element = new $element;
$element->load($this->_params['id']);
$this->_params['id'] = $element;
}
$class->{$segments[1]}(...array_values($this->_params));
} else {
$r = new \ReflectionFunction($callback);
if(sizeof($r->getParameters()) > 0 && $r->getParameters()[0]->getClass() != NULL){
$element;
$element = $r->getParameters()[0]->getClass()->name;
$element = new $element;
$element->load($this->_params['id']);
$this->_params['id'] = $element;
}
call_user_func_array($callback, $this->_params);
}
}
foreach ($this->_after as $after) {
call_user_func($after);
}
}
function prepare() {
$this->_segments = explode('/', $this->_uri);
foreach ($this->_segments as $segment) {
if (strpos($segment, 'i:') > -1) {
$this->_regex .= "\/[0-9]+";
} else if (strpos($segment, 'h:') > -1) {
$this->_regex .= "\/[A-z]+";
} else if (strpos($segment, ':') > -1) {
$this->_regex .= "\/[A-z0-9]+";
} else {
$this->_regex .= "\/" . $segment;
}
}
$this->_regex = ltrim($this->_regex, '\/');
$this->_regex = "/\/" . $this->_regex . "$/";
}
function create_indexes() {
foreach ($this->_segments as $key => $segment) {
if (preg_match('/\[.*?\]$/', $segment)) {
$segment = trim(trim($segment, '['), ']');
$param = explode(':', $segment);
$this->_params[$param[1]] = $this->_uri_segments[$key];
}
}
}
function set_uri($uri) {
$this->_uri = $uri;
return $this;
}
function get_segments() {
return $this->_segments;
}
function do_block() {
$this->_block = true;
return $this;
}
function not_block() {
$this->_block = false;
return $this;
}
function do_ignore() {
$this->_ignore = true;
return $this;
}
function not_ignore() {
$this->_ignore = false;
return $this;
}
function middleware_ignore($name = '') {
$this->_middlewares_to_ignore[] = $name;
return $this;
}
function middleware_add($name = '') {
$this->_before[$name] = $function;
}
function middleware_append($name = '', $function) {
$this->_before[$name] = $function;
}
function set_weight($weigth = 0) {
$this->_weight = $weigth;
return $this;
}
function set_http_error($code = 400, $message = null) {
if ($message == null) {
$message = self::$http_messages[$code];
}
$info = new \stdClass();
$info->code = $code;
$info->message = $message;
$this->_http_error = $info;
return $this;
}
function match($uri) {
//Wildcards allways match
if (in_array('*', $this->_verb) || $this->_uri == '*') {
return true;
}
if (preg_match($this->_regex, $uri)) {
$this->_uri_segments = explode('/', $uri);
$this->create_indexes();
return true;
}
return false;
}
}
+323
View File
@@ -0,0 +1,323 @@
<?php
namespace Routes;
class RouteCollection {
private static $_route_collection;
public $_uri = '/';
public $_routes = Array();
private $_verb = '';
private $_loaded_files = Array();
private $_errors = Array();
private $_default_middlewares = Array();
private $_middleware_set = Array();
private static $_verbs_whitelist = Array('*', 'GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'CLI');
private static $_verbs_web = Array('GET', 'POST', 'PUT', 'PATCH', 'DELETE');
//SINGLETON==============================================
private function __construct() {
}
private static function newObj() {
if (!isset(self::$_route_collection)) {
self::$_route_collection = new RouteCollection();
if (php_sapi_name() == "cli") {
self::$_route_collection->_uri = isset($_SERVER['argv'][1]) ? '/' . $_SERVER['argv'][1] : '/';
} else {
self::$_route_collection->_uri = isset($_SERVER['REQUEST_URI']) ? explode('?', $_SERVER['REQUEST_URI'])[0] : '/';
}
self::$_route_collection->define_verb();
}
return self::$_route_collection;
}
/**
*
*/
public static function getInstance() {
if (!isset(self::$_route_collection)) {
return self::newObj();
}
return self::$_route_collection;
}
//HELPERS================================================
/*
* Find route files with names under pathname
*/
public function crawl($basepath = __DIR__, $filenames = Array('Routes.php', 'routes.php')) {
$instance = self::getInstance();
$rdi = new \RecursiveDirectoryIterator($basepath);
foreach (new \RecursiveIteratorIterator($rdi) as $file) {
foreach ($filenames as $filename) {
if (strpos($file, $filename)) {
$instance->_loaded_files[] = $file;
}
}
}
return $instance;
}
/**
*
* Load the files with the routes
*/
function load_routes() {
$instance = self::getInstance();
foreach ($instance->_loaded_files as $loaded_file) {
include $loaded_file;
}
return $instance;
}
/**
*
* GET | POST | PUT | PATCH | DELETE | CLI
*
*/
private function define_verb() {
$verb = '';
if (isset($_POST['_method'])) {
$verb = strtoupper($_POST['_method']);
} else if (php_sapi_name() == "cli") {
$verb = "CLI";
} else {
$verb = strtoupper($_SERVER['REQUEST_METHOD']);
}
if (in_array($verb, self::$_verbs_whitelist)) {
$this->_verb = $verb;
} else {
echo 'Invalid Verb';
}
}
/**
*
*/
private function sort_routes() {
usort($this->_routes, function($a, $b) {
if ($a->_weight == $b->_weight) {
return 0;
}
return ($a->_weight < $b->_weight) ? -1 : 1;
});
}
/**
*
*/
function submit() {
global $ROUTE;
self::$_route_collection->sort_routes();
$one_hit = false;
foreach (self::$_route_collection->_routes as $route) {
if (!in_array(self::$_route_collection->_verb, $route->_verb) && !in_array('*', $route->_verb)) {
//No it is not
continue;
}
//Request match a route
$match = $route->match(self::$_route_collection->_uri);
if ($match) {
//Yup. Execute the route
$ROUTE = $route;
$route->_before = $this->_default_middlewares;
$route->execute();
if (!$route->_ignore) {
$one_hit = true;
}
if ($route->_http_error) {
$this->http_error($route->_http_error);
return;
}
//If Executed, interrupt route chain?
if ($route->_block) {
return;
}
}
}
if (!$one_hit) {
$info = new \stdClass();
$info->code = 404;
$info->message = 'Not Found';
self::$_route_collection->http_error($info);
}
}
//DEFINITORS=============================================
/**
*
*/
static function get($uri, $callback, $weight = 0) {
$route = new Route();
$route->_verb[] = 'GET';
$route->_uri = $uri;
$route->_callback[] = $callback;
$route->_weight = $weight;
$route->prepare();
self::getInstance()->_routes[] = $route;
return $route;
}
/**
*
*/
static function post($uri, $callback, $weight = 0) {
$route = new Route();
$route->_verb[] = 'POST';
$route->_uri = $uri;
$route->_callback[] = $callback;
$route->_weight = $weight;
$route->prepare();
self::getInstance()->_routes[] = $route;
return $route;
}
/**
*
*/
static function put($uri, $callback, $weight = 0) {
$route = new Route();
$route->_verb[] = 'PUT';
$route->_uri = $uri;
$route->_callback[] = $callback;
$route->_weight = $weight;
$route->prepare();
self::getInstance()->_routes[] = $route;
return $route;
}
/**
*
*/
static function patch($uri, $callback, $weight = 0) {
$route = new Route();
$route->_verb[] = 'PATCH';
$route->_uri = $uri;
$route->_callback[] = $callback;
$route->_weight = $weight;
$route->prepare();
self::getInstance()->_routes[] = $route;
return $route;
}
/**
*
*/
static function delete($uri, $callback, $weight = 0) {
$route = new Route();
$route->_verb[] = 'DELETE';
$route->_uri = $uri;
$route->_callback[] = $callback;
$route->_weight = $weight;
$route->prepare();
self::getInstance()->_routes[] = $route;
return $route;
}
static function resource($uri) {
throw new Exception('Not implemented');
}
/**
*
*/
static function add($verb, $uri, $callback, $weight = 0) {
$route = new Route();
if (is_array($verb)) {
$route->_verb = array_map('strtoupper', $verb);
} else if (strtoupper($verb) == 'WEB') {
$route->_verb[] = self::_verbs_web;
} else {
$route->_verb[] = strtoupper($verb);
}
$route->_uri = $uri;
$route->_callback[] = $callback;
$route->_weight = $weight;
$route->prepare();
self::getInstance()->_routes[] = $route;
return $route;
}
/**
*
*/
function addRoute(Route $route) {
$this->_routes[] = $route;
}
/**
*
*/
static function addDefaultMiddleware($name = '', $function) {
self::getInstance()->_default_middlewares[$name] = $function;
}
/**
*
*/
static function registerMiddleware($name = '', $function) {
self::getInstance()->_middleware_set[$name] = $function;
}
/**
*
*/
static function on_http_error($function) {
$instance = self::getInstance();
$instance->_errors[] = $function;
}
/**
*
*/
private function http_error(\stdClass $info) {
$info = (array) $info;
foreach ($this->_errors as $error) {
call_user_func_array($error, $info);
}
}
}