Advertisement
alex1rap

UrlManager

Jun 20th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.92 KB | None | 0 0
  1. <?php
  2. ...
  3.  
  4.     /**
  5.      * Руками не трогать!
  6.      **/
  7.     public static function parseURI($uri, $rule = null)
  8.     {
  9.         $config = APP_CONFIG;
  10.         $parameters = [];
  11.         $parameters['uri'] = $uri;
  12.         $rules = $config['routing']['rules'];
  13.         foreach ($rules as $pattern2 => $route) {
  14.             $pattern = preg_replace("%<(\w+)\:\\\(\w\+?)>%i", "(?<$1>(\\\\$2))", $pattern2);
  15.             $pattern = preg_replace("%<controller>%i", "(?<controller>(.*))", $pattern);
  16.             $pattern = preg_replace("%<action>%i", "(?<action>(\w+))", $pattern);
  17.             if (@preg_match("%^(\/)?{$pattern}$%i", $parameters['uri'], $params)) {
  18.                 $route = str_replace([
  19.                     '<controller>',
  20.                     '<action>'
  21.                 ], [
  22.                     $params['controller'],
  23.                     $params['action']
  24.                 ], $route);
  25.                 $parameters['uri'] = $route;
  26.                 $parameters['params'] = $params;
  27.                 if (isset($params['action'])) {
  28.                     $parameters['action'] = $params['action'];
  29.                 }
  30.                 break;
  31.             }
  32.         }
  33.         $pars = self::parseRoute($parameters['uri']);
  34.         return $pars;
  35.     }
  36.  
  37.     /**
  38.      * Руками не трогать!
  39.      **/
  40.     protected static function parseRoute($uri)
  41.     {
  42.         if (preg_match("/^\/?(?<controller>([0-9a-z\/]+))\/(?<action>(\w+))\/?$/i", $uri, $matches)) {
  43.             $controllerPath = $matches['controller'];
  44.             $file = explode('/', $controllerPath);
  45.             $controllerClass = 'app\\controllers\\';
  46.             for ($c = 0; $c < count($file); $c++) {
  47.                 if ($c == (count($file) - 1)) {
  48.                     $controllerClass .= ucfirst(strtolower($file[$c])) . 'Controller';
  49.                 } else {
  50.                     $controllerClass .= strtolower($file[$c]) . '\\';
  51.                 }
  52.             }
  53.             $action = 'action' . ucfirst(strtolower($matches['action']));
  54.             $params = [];
  55.             if (class_exists($controllerClass) AND in_array($action, get_class_methods($controllerClass))) {
  56.                 $params['controller'] = $controllerClass;
  57.                 $params['action'] = $action;
  58.             } else {
  59.                 $config = APP_CONFIG['routing']['errors']['error404'];
  60.                 $params['controller'] = $config['controller'];
  61.                 $params['action'] = $config['action'];
  62.             }
  63.             $res = new self($params);
  64.             return $res;
  65.         }
  66.         $config = APP_CONFIG['routing']['errors']['error404'];
  67.         return new self([
  68.             'controller' => $config['controller'],
  69.             'action' => $config['action']
  70.         ]);
  71.     }
  72.  
  73.     public function getRoute()
  74.     {
  75.         return [
  76.             'controller' => $this->controller,
  77.             'action' => $this->action
  78.         ];
  79.     }
  80. ...
  81. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement