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."; }
/** * 加载控制器 */ 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"); }
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; }