Guest User

Untitled

a guest
Dec 14th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.71 KB | None | 0 0
  1. <?php
  2. class Router {
  3.  
  4. public $routes = array();
  5.  
  6. private $types = [
  7. 'number' => '(\d+)',
  8. 'text' => '([a-zA-Z]+)',
  9. 'mixed' => '(\w+)'
  10. ];
  11.  
  12. public function __construct(array $routes = []) {
  13. $this->register($routes);
  14. }
  15.  
  16. private function routeToRegExp($path) {
  17. $arrPath = explode('/', $path);
  18. $params = array( 'originalPath' );
  19.  
  20.  
  21. $arrExp = array();
  22.  
  23. foreach ($arrPath as $segment) {
  24.  
  25. if (strpos($segment, ':') === false) {
  26. $arrExp[] = $segment;
  27. } else {
  28. $expression = explode(':', $segment);
  29. $paramName = $expression[0];
  30. $params[] = $paramName;
  31. $arrExp[] = isset($this->types[$expression[1]]) ? $this->types[$expression[1]] : $this->types['mixed'];
  32. }
  33. }
  34.  
  35.  
  36. if($arrExp[count($arrExp) -1] == '') {
  37. unset($arrExp[count($arrExp) -1]);
  38. }
  39.  
  40. $regString = '/' . implode('\/', $arrExp).'.*/';
  41.  
  42. return array(
  43. 'reg' => $regString,
  44. 'params' => $params
  45. );
  46. }
  47.  
  48. private function register($routes) {
  49. foreach ($routes as $path => $fn) {
  50. $pathReg = $this->routeToRegExp($path);
  51. $this->routes[$pathReg['reg']] = array(
  52. 'fn' => $fn,
  53. 'params' => $pathReg['params']
  54. );
  55. }
  56. }
  57.  
  58. private function mapParams($params, $result) {
  59. $map = array();
  60. foreach($result as $key => $value) {
  61. $map[$params[$key]] = $value;
  62. }
  63.  
  64. return $map;
  65. }
  66.  
  67. public function route(array $path) {
  68. $selectedFn = null;
  69. $url = $this->normalizePath($path);
  70. foreach ($this->routes as $reg => $data) {
  71. $isMatch = preg_match($reg, $url, $match);
  72. if ($isMatch) {
  73. $selectedFn = $data['fn'];
  74. break;
  75. }
  76. }
  77.  
  78. if($selectedFn == null) {
  79. return false;
  80. }
  81. return $selectedFn($this->mapParams($data['params'],$match));
  82. }
  83.  
  84. public function add($path, $fn) {
  85. $pathReg = $this->routeToRegExp($path);
  86. $this->routes[$pathReg['reg']] = array(
  87. 'fn' => $fn,
  88. 'params' => $pathReg['params']
  89. );
  90. }
  91.  
  92. private function normalizePath(array $path): string {
  93. $url = array();
  94. foreach($path as $key => $item) {
  95. if(is_numeric($key)) {
  96. $url[$key] = $item;
  97. }
  98. }
  99.  
  100. return '/'.implode('/', $url);
  101. }
  102. }
Advertisement
Add Comment
Please, Sign In to add comment