<?php
namespace Fury\Modules\Router;
use \Fury\Kernel\CallControl;
/**
* Routing module
* Author: Eugene Sukhodolkiy
* Date: 09.01.2020
* LastUpdate: 12.01.2020
* Version: 0.2 beta
*/
class Router implements RouterInterface{
/**
* Container with router implementation
*/
use RouterImplementation;
/**
* Constructor
*
* @method __construct
*
* @param array $routes_map Starting routes map
*/
public function __construct($routes_map = NULL){
$this -> call_control_instance = CallControl::ins();
if(is_array($routes_map)){
$this -> routes_map = $routes_map;
}
$this -> uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : "";
if(strpos($this -> uri, '?') !== false){
list($this -> uri) = explode('?', $this -> uri);
}
$uri_length = strlen($this -> uri);
if($uri_length > 1 and $this -> uri[$uri_length - 1] == '/'){
$this -> uri = mb_substr($this -> uri, 0, -1);
}
}
public function get($route, $action, $static_uri = ''){
if(is_array($route)){
$route = implode('&', $route);
$route = strlen($static_uri) ? $static_uri . '?' . $route : $route;
}
$this -> add_route('get', $route, $action);
}
public function post($route, $action, $static_uri = ''){
if(is_array($route)){
$route = implode('&', $route);
$route = strlen($static_uri) ? $static_uri . '?' . $route : $route;
}
$this -> add_route('post', $route, $action);
}
public function uri($route, $action){
$this -> add_route('uri', $route, $action);
}
public function get_routes_map(){
return $this -> routes_map;
}
public function start_routing(){
$result = [];
$result['get'] = $this -> GET_and_POST_routing($this -> routes_map['get'], $_GET);
$result['post'] = $this -> GET_and_POST_routing($this -> routes_map['post'], $_POST);
$result['uri'] = $this -> URI_routing($this -> routes_map['uri']);
}
public function route_to(String $action){
$routes_list = [];
$routes_map = array_merge($this -> routes_map['uri'], $this -> routes_map['get'], $this -> routes_map['post']);
$route = array_search($action, $routes_map);
return $route === false ? '' : $route;
}
public function urlto(String $action, Array $params = []){
$route_template = $this -> route_to($action);
if(strpos($route_template, '?') === false){
$route_params = $this -> get_params_from_route_template($route_template);
$url = str_replace($route_params, $params, $route_template);
}else{
$route_params = [];
foreach($params as $var => $val){
$route_params[] = $var;
$params[$var] = $var . '=' . $val;
}
$route_template = explode('?', $route_template);
$route_template[1] = str_replace($route_params, $params, $route_template[1]);
$url = implode('?', $route_template);
}
return $url;
}
}