Example #1
0
 public static function dispatch()
 {
     $uri = strtolower(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
     $uri = str_replace(FRONT_CONTROLLER, "", $uri);
     $method = $_SERVER['REQUEST_METHOD'];
     if ($uri != "/" && preg_match("#/\$#", $uri)) {
         $uri = substr($uri, 0, -1);
     }
     self::$routes = str_replace('//', '/', self::$routes);
     if (in_array($uri, self::$routes)) {
         $arrayPos = array_keys(self::$routes, $uri);
         foreach ($arrayPos as $pos) {
             if (self::$methods[$pos] == $method || self::$methods[$pos] == 'ANY') {
                 self::invoke(self::$controllers[$pos]);
                 return;
             }
         }
     } else {
         $arrayPos = 0;
         $bestRoute = ['route' => "", 'splits' => 0, 'params' => []];
         $uriSplits = explode("/", $uri);
         $uriSplitsCount = count($uriSplits);
         foreach (self::$routes as $route) {
             $route = strtolower(str_replace('//', '/', $route));
             if (preg_match("#/\$#", $route)) {
                 $route = substr($route, 0, -1);
             }
             $routeSplits = explode("/", $route);
             $routeSplitsCount = count($routeSplits);
             $matcher = 0;
             $params = [];
             if ((self::$methods[$arrayPos] == $method || self::$methods[$arrayPos] == 'ALL') && $routeSplits[0] === $uriSplits[0]) {
                 $matcher++;
                 for ($i = 1; $i < $routeSplitsCount; $i++) {
                     if (isset($uriSplits[$i]) && $routeSplits[$i] === $uriSplits[$i]) {
                         $matcher++;
                     } elseif (preg_match("#{+(.*?)}#", $routeSplits[$i], $arr)) {
                         $matcher++;
                         $params[] = isset($uriSplits[$i]) ? $uriSplits[$i] : null;
                     }
                 }
                 if ($matcher > $bestRoute['splits']) {
                     $bestRoute['route'] = $route;
                     $bestRoute['method'] = self::$controllers[$arrayPos];
                     $bestRoute['splits'] = $matcher;
                     $bestRoute['params'] = $params;
                 }
             }
             $arrayPos++;
         }
         if ($bestRoute['splits'] > 0) {
             self::invoke($bestRoute['method'], $bestRoute['params']);
             return;
         }
     }
     echo "ERROR 404. Route (" . $uri . ") not found.";
 }
Example #2
0
 /**
  * 加载控制器
  */
 public static function Controller($class, $isView = false, $isMuti = false, $functionName = null)
 {
     $class = str_replace(array('.', '#'), array('\\', '.'), $class);
     if ($isView) {
         self::$isView = true;
         self::$isViewMuti = $isMuti;
     }
     BaseClass::$functionName = $functionName;
     return self::getClass("\\AppMain\\controller\\" . $class . "Controller");
 }
Example #3
0
 function run()
 {
     // Получаем URI.
     $uri = $this->uri;
     if (strpos($uri, '?') !== FALSE) {
         parse_str(substr($uri, strpos($uri, '?') + 1), $_GET);
         $uri = substr($uri, 0, strpos($uri, '?'));
     }
     if ($uri == '') {
         $uri = 'none';
     }
     $segments = explode('/', $uri);
     $this->routes[] = array('rules' => include Path::getRoot('app/routes.php'));
     $uri = implode('/', $segments);
     $this->routes = array_reverse($this->routes);
     // Пытаемся применить к нему правила из конфигуации.
     foreach ($this->routes as $routes) {
         foreach ($routes['rules'] as $pattern => $route) {
             // Если правило совпало.
             if (preg_match("~^{$pattern}\$~", $uri) && $pattern != ' ') {
                 $internalRoute = preg_replace("~{$pattern}~", $route, $uri, 1);
                 // print_r($internalRoute);
                 //  echo $uri;
                 //   echo $route;
                 $segments = explode('|', $internalRoute);
                 $controller_folder = array_shift($segments);
                 $controller_url = array_shift($segments);
                 $controller = ucfirst($controller_url) . 'Controller';
                 $action_array = explode('-', array_shift($segments));
                 $action_name = '';
                 foreach ($action_array as $action) {
                     $action_name .= $action;
                 }
                 //  echo $action_name;
                 $params = array();
                 $params['action'] = $action_name;
                 $action_name = ucfirst($action_name);
                 // echo $actionName;
                 if (!$action_name) {
                     $action_name = 'Index';
                 }
                 $action = 'action' . $action_name;
                 // Остальные сегменты — параметры.
                 $parameters = $segments;
                 // echo 12;
                 // print_r($parameters);
                 foreach ($parameters as &$parameter) {
                     $key_value = explode('=', $parameter);
                     if (isset($key_value[1])) {
                         $params[$key_value[0]] = $key_value[1];
                     } else {
                         $params[] = $key_value[0];
                     }
                 }
                 $params['controller'] = $controller_url;
                 $controller_object = ControllerFactory::getController($controller, $controller_folder);
                 self::$params = $params;
                 self::$rule = $pattern;
                 $controller_object->run($action, $params, $controller_url);
                 // Вызываем действие контроллера с параметрами
                 return;
             }
         }
     }
     $controller_folder = '';
     //array_shift($segments);
     $controller_url = array_shift($segments);
     // two is controller
     $controller = ucfirst($controller_url) . 'Controller';
     // three — действие.
     $action_array = explode('-', array_shift($segments));
     $action_name = '';
     foreach ($action_array as $action) {
         $action_name .= $action;
     }
     $params = array();
     $params['action'] = $action_name;
     $action_name = ucfirst($action_name);
     // echo $actionName;
     if (!$action_name) {
         $action_name = 'Index';
     }
     $action = 'action' . $action_name;
     $parameters = $segments;
     //  $params = array();
     foreach ($parameters as &$parameter) {
         $key_value = explode('=', $parameter);
         if (isset($key_value[1])) {
             $params[$key_value[0]] = $key_value[1];
         } else {
             $params[] = $key_value[0];
         }
     }
     $params['controller'] = $controller_url;
     // Подключаем файл контроллера, если он имеется
     //print_r($action);
     //    echo $controller_folder;
     $controller_object = ControllerFactory::getController($controller, $controller_folder);
     self::$params = $params;
     // Если не загружен нужный класс контроллера или в нём нет
     // нужного метода — 404
     $controller_object->run($action, $params, $controller_url);
     // Вызываем действие контроллера с параметрами
     return;
 }