First Commit

This commit is contained in:
2018-07-19 21:37:01 -03:00
commit 61f90338dd
4 changed files with 665 additions and 0 deletions
+237
View File
@@ -0,0 +1,237 @@
<?php
namespace BBRouter;
/*
*
*/
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;
/*
* 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 $before){
call_user_func($before);
}
foreach ($this->_callback as $callback){
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;
}
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 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;
}
}