/** * 测试对 URL 的分析 */ function testParse() { $router = new QRouter(QContext::instance()); foreach ($this->_tests_url as $route_name => $test) { list($route_name) = explode('-', $route_name); $path = $test['_path']; unset($test['_path']); $result = $router->match($path); foreach ($test as $varname => $value) { if (!array_key_exists($varname, $result) || $value != $result[$varname]) { QDebug::dump($router->get($route_name), "route: {$route_name}"); QDebug::dump($result, 'parse result'); } $this->assertArrayHasKey($varname, $result); $this->assertEquals($value, $result[$varname], sprintf('expected varname "%s" value is "%s".', $varname, $value)); unset($result[$varname]); } $this->assertEmpty($result); } }
/** * 测试对 URL 的分析 */ function testParse() { $router = new QRouter(); $router->import(Q::ini('routes')); foreach ($this->_tests_url as $route_name => $test) { list($route_name) = explode('-', $route_name); $path = $test['_path']; unset($test['_path']); $result = $router->match($path); $this->assertType('array', $result); foreach ($test as $varname => $value) { if (!array_key_exists($varname, $result) || $value != $result[$varname]) { $r = $router->lastMatchedRouteName(); dump($test, "path: {$path}"); dump($router->get($r), "matched route: {$r}"); dump($result, 'parse result'); dump($router->get($route_name), "expected route: {$route_name}"); } $this->assertArrayHasKey($varname, $result, "\$result has't key: {$varname}."); $this->assertEquals($value, $result[$varname], sprintf('expected varname "%s" value is "%s".', $varname, $value)); unset($result[$varname]); } foreach ($result as $key => $value) { switch ($key) { case QContext::UDI_CONTROLLER: case QContext::UDI_NAMESPACE: case QContext::UDI_MODULE: $this->assertEquals('default', $value); break; case QContext::UDI_ACTION: $this->assertEquals('index', $value); break; default: $this->assertEmpty($value, "\$result[{$key}] not empty."); } } } }
/** * 根据服务器运行环境,重新初始化 QContext 对象 * * @param boolean $full_init 是否进行完全的初始化 */ function reinit($full_init = false) { if ($full_init) { $this->_params = array(); $this->_router = null; } self::$_request_uri = null; self::$_base_uri = null; self::$_base_dir = null; self::$_url_mode = null; // 如果有必要,初始化路由服务 $url_mode = strtolower(Q::ini('dispatcher_url_mode')); if (is_null($this->_router) && ($url_mode == self::URL_MODE_PATHINFO || $url_mode == self::URL_MODE_REWRITE)) { $this->_router = new QRouter(); $this->_router->import(Q::ini('routes'), 'global_default_routes'); $result = $this->_router->match('/' . ltrim($this->pathinfo(), '/')); if ($result) { foreach ($result as $var => $value) { if (strlen($value) === 0) { continue; } if (!isset($_GET[$var]) || strlen($_GET[$var]) === 0) { $_GET[$var] = $_REQUEST[$var] = $value; } } } } self::$_url_mode = $url_mode; // 从 $_GET 中提取请求参数 $keys = array_keys($_GET); if (!empty($keys)) { $keys = array_combine($keys, $keys); $keys = array_change_key_case($keys); } $udi = array(); $udi[self::UDI_CONTROLLER] = isset($keys[self::UDI_CONTROLLER]) ? $_GET[$keys[self::UDI_CONTROLLER]] : null; $udi[self::UDI_ACTION] = isset($keys[self::UDI_ACTION]) ? $_GET[$keys[self::UDI_ACTION]] : null; $udi[self::UDI_MODULE] = isset($keys[self::UDI_MODULE]) ? $_GET[$keys[self::UDI_MODULE]] : null; $udi[self::UDI_NAMESPACE] = isset($keys[self::UDI_NAMESPACE]) ? $_GET[$keys[self::UDI_NAMESPACE]] : null; $this->changeRequestUDI($udi); }
/** * 根据 php.ini 中的 magic quotes gpc 设置去除超全局变量中自动添加的转义符 */ private function _initOneTime() { if (self::$_root) { return; } self::$_root = $this; // 禁止 magic quotes set_magic_quotes_runtime(0); // 处理被 magic quotes 自动转义过的数据 if (get_magic_quotes_gpc()) { $in = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST); while (list($k, $v) = each($in)) { foreach ($v as $key => $val) { if (!is_array($val)) { $in[$k][$key] = stripslashes($val); continue; } $in[] =& $in[$k][$key]; } } unset($in); } $url_mode = strtolower($this->getIni('dispatcher_url_mode')); if ($url_mode == self::URL_MODE_PATHINFO || $url_mode == self::URL_MODE_REWRITE) { $this->_router = new QRouter($this); $result = $this->_router->match($this->getPathinfo()); if ($result) { foreach ($result as $var => $value) { if (empty($_GET[$var])) { $_GET[$var] = $_REQUEST[$var] = $value; } } } self::$_url_mode = $url_mode; } else { self::$_url_mode = self::URL_MODE_STANDARD; $this->_router = null; } }