<?php
namespace Fury\Modules\Router;
use \Fury\Kernel\CallControl;
trait RouterImplementation{
/**
* Map of routes for routing
*
* @var array
*/
protected $routes_map = ['get' => [], 'post' => [], 'uri' => []];
/**
* Current URI REQUEST
*
* @var string
*/
public $uri;
/**
* Instance of class CallControl
*
* @var CallControl
*/
protected $call_control_instance;
/**
* Method for getting params from uri request by route template
*
* @method required_params_from_uri
*
* @param [string] $route_template [Route template]
* @param [string] $uri_path [Current URI request]
*
* @return [array] [Array with result searching params]
*/
protected function required_params_from_uri($route_template, $uri_path){
$route_template_parts = explode('/', $route_template);
$uri_parts = explode('/', $uri_path);
$params = [];
foreach ($route_template_parts as $i => $part) {
if(strlen($part) and $part[0] != '$'){
continue;
}
$params[mb_substr($part, 1, strlen($part))] = $uri_parts[$i];
}
return $params;
}
/**
* Routing by GET and POST vars
*
* @method GET_and_POST_routing
*
* @param [array] $routes_map_part [Array with routes templates]
* @param [array] $vars [Current vars GET or POST]
*/
protected function GET_and_POST_routing($routes_map_part, $vars){
$result_routes = [];
foreach ($routes_map_part as $route => $action) {
if(strpos($route, '?')){
list($route_uri, $route_vars) = explode('?', $route);
}else{
$route_vars = $route;
}
$route_vars = explode('&', $route_vars);
$flag = true;
if(isset($route_uri) and $route_uri != $this -> uri){
$flag = false;
}
foreach ($route_vars as $i => $rvar) {
if(!isset($vars[$rvar])){
$flag = false;
break;
}
}
if($flag){
$result_routes[$route] = $action;
$this -> call_control_instance -> call_action(true, $route, $action, $vars);
}
}
return $result_routes;
}
/**
* Searching routes templates by current URI
*
* @method searching_route_by_uri
*
* @param [array] $routes_map Where need searching
* @param [string] $uri Current URI
*
* @return [array] [Array with result searching]
*/
protected function searching_route_by_uri($routes_map, $uri){
$results_routes_templates = [];
$uri_parts = explode('/', $uri);
$count_uri_parts = count($uri_parts);
foreach ($routes_map as $route_template => $action) {
if(strpos($route_template, '$') === false){
continue;
}
$route_parts = explode('/', $route_template);
if(count($route_parts) != $count_uri_parts){
continue;
}
$flag = true;
foreach ($route_parts as $i => $part) {
if(strlen($part) and $part[0] == '$'){
continue;
}
if($part != $uri_parts[$i]){
$flag = false;
break;
}
}
if($flag){
$results_routes_templates[] = $route_template;
}
}
return $results_routes_templates;
}
/**
* Implementation URI Routing
*
* @method URI_routing
*
* @param [array] $routes_map_part [Part of routes map for URI routing]
*
* @return [array] [Array with routes templates, that we need]
*/
protected function URI_routing($routes_map_part){
$result_routes_templates = [];
if(isset($routes_map_part[$this -> uri])){
$this -> call_control_instance -> call_action(false, $this -> uri, $routes_map_part[$this -> uri]);
}else{
$routes_templates = $this -> searching_route_by_uri($routes_map_part, $this -> uri);
$params = [];
foreach($routes_templates as $i => $template){
$params[$template] = $this -> required_params_from_uri($template, $this -> uri);
$this -> call_control_instance -> call_action(false, $template, $routes_map_part[$template], $params[$template]);
}
$result_routes_templates[] = [
'routes_templates' => $routes_templates,
'params' => $params
];
}
return $result_routes_templates;
}
/**
* [Add new route to routes map]
*
* @method add_route
*
* @param [string] $method [Method of routing "GET_POST" or "URI"]
* @param [string or array] $route [uri route or array with vars names GET/POST]
* @param [string or function] $action [anon func or string name of function or Classname@methodname]
*/
protected function add_route($method, $route, $action){
$this -> routes_map[$method][$route] = $action;
}
/**
* Get Parameters from route template. Only for uri routes
*
* @method get_params_from_route_template
*
* @param String $route_template
*
* @return array
*/
protected function get_params_from_route_template(String $route_template){
$template_parts = explode('/', $route_template);
$params = [];
foreach ($template_parts as $part) {
if(isset($part[0]) and $part[0] == '$'){
$params[] = $part;
}
}
return $params;
}
}