/** * 设置路由 * * @param array $router */ public static function set(array $router) { if (self::$modules_status == 0) { self::$modules_status = 1; } if (Base::hasMatched()) { return; } // 匹配前缀 $prefix = strval(array_get($router, 'prefix', '')); if ($prefix === "") { $prefix = self::$prefix; } if ($prefix !== Base::getPrefix()) { return; } // 匹配控制器 $controllers = array_get($router, 'controllers', []); if (!is_array($controllers) || empty($controllers)) { throw new \InvalidArgumentException("路由配置有误,'controllers'的值必须是非空数组"); } $controller = strval(array_get($controllers, Base::getController(), '')); if (empty($controller)) { return; } // 处理命名空间 $namespace = strval(array_get($router, 'namespace', '')); self::handleConfigNamespace($namespace, $prefix); // 获取中间件,延迟处理 - 需要先加载其他模块才能处理中间件 $middleware = array_get($router, 'middlewares', []); Http\Middleware\QpMiddleware::handleConfigMiddleware($middleware, $namespace); Base::saveRouterData(['namespace' => $namespace, 'controller' => $controller, 'middleware' => $middleware]); Base::match(); }
/** * 处理用户请求的路由 * 匹配失败直接抛出异常,成功则返回设置过的Phalcon路由对象 * * @return \Phalcon\Mvc\Router Phalcon的路由对象 * @throws \ErrorException */ private function handleRouter() { require_once QP_APP_PATH . "routers.php"; if (QR::hasMatched() == false) { echo (new \App\Controllers\IndexController())->notFoundAction(); exit; } $matched_router_data = QR::getMatchedData(); $ns = $matched_router_data['namespace']; $ctrl = $matched_router_data['controller']; $m = QR::getMethod(); if (!method_exists($ns . "\\" . $ctrl . "Controller", $m . "Action")) { echo (new \App\Controllers\IndexController())->notFoundAction(); exit; } $router = new \Phalcon\Mvc\Router(); $router->setDefaults(["namespace" => $ns, "controller" => $ctrl, "action" => $m]); return $router; }