Advertisement
0xbro

Router.php

Apr 21st, 2022
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.83 KB | None | 0 0
  1. <?php
  2. class Router
  3. {
  4.     public $routes = [];
  5.  
  6.     public function new($method, $route, $controller)
  7.     {
  8.         $r = [
  9.             'method' => $method,
  10.             'route'  => $route,
  11.         ];
  12.  
  13.         if (is_callable($controller))
  14.         {
  15.             $r['controller']    = $controller;
  16.             $this->routes[]     = $r;
  17.         }
  18.         else if (strpos($controller, '@'))
  19.         {
  20.             $split      = explode('@', $controller);
  21.             $class      = $split[0];
  22.             $function   = $split[1];
  23.            
  24.             $r['controller'] = [
  25.                 'class'     => $class,
  26.                 'function'  => $function
  27.             ];
  28.            
  29.             $this->routes[] = $r;
  30.         }
  31.         else
  32.         {
  33.             throw new Exception('Invalid controller');
  34.         }
  35.     }
  36.  
  37.     public function match()
  38.     {
  39.         foreach($this->routes as $route)
  40.         {
  41.             if ($this->_match_route($route['route']))
  42.             {
  43.                 if ($route['method'] != $_SERVER['REQUEST_METHOD'])
  44.                 {
  45.                     $this->abort(405);
  46.                 }
  47.                 $params = $this->getRouteParameters($route['route']);
  48.  
  49.                 if (is_array($route['controller']))
  50.                 {
  51.                     $controller = $route['controller'];
  52.                     $class      = $controller['class'];
  53.                     $function   = $controller['function'];
  54.  
  55.                     return (new $class)->$function($this,$params);
  56.                 }
  57.                 return $route['controller']($this,$params);
  58.             }
  59.         }
  60.  
  61.         $this->abort(404);
  62.     }
  63.  
  64.     public function _match_route($route)
  65.     {
  66.         $uri = explode('/', strtok($_SERVER['REQUEST_URI'], '?'));
  67.         $route = explode('/', $route);
  68.  
  69.         if (count($uri) != count($route)) return false;
  70.  
  71.         foreach ($route as $key => $value)
  72.         {
  73.             if ($uri[$key] != $value && $value != '{param}') return false;
  74.         }
  75.  
  76.         return true;
  77.     }
  78.  
  79.     public function getRouteParameters($route)
  80.     {
  81.         $params = [];
  82.         $uri = explode('/', strtok($_SERVER['REQUEST_URI'], '?'));
  83.         $route = explode('/', $route);
  84.  
  85.         foreach ($route as $key => $value)
  86.         {
  87.             if ($uri[$key] == $value) continue;
  88.             if ($value == '{param}')
  89.             {
  90.                 if ($uri[$key] == '')
  91.                 {
  92.                     $this->abort(404);
  93.                 }
  94.                 $params[] = $uri[$key];
  95.             }
  96.         }
  97.  
  98.         return $params;
  99.     }
  100.  
  101.     public function abort($code)
  102.     {
  103.         http_response_code($code);
  104.         exit;
  105.     }
  106.  
  107.     public function view($view, $data = [])
  108.     {
  109.         extract($data);
  110.         include __DIR__."/views/${view}.php";
  111.         exit;
  112.     }
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement