用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - php代码库

CodeIgniter URI组件

2014-12-04 作者: php源代码大全举报

[php]代码库

<?php
// URI组件里面有很多方法,大都是一些辅助作用的方法,而此方法是URI最主线的一个方法。
function _fetch_uri_string()
{
	//下面的uri_protocol是在config.php里面的一个配置项,其实是问你用哪种方式去检测uri的信息的意思,
    //默认是AUTO,自动检测,也就是通过各种方式检测,直至检测到,或者全部方式都检测完。
	if (strtoupper($this->config->item('uri_protocol')) == 'AUTO')
	{
		// Is the request coming from the command line?
		//开始尝试各种方式,主要有:命令行,REQUEST_URI, PATH_INFO, QUERY_STRING.

        //下面会多次出现$this->_set_uri_string($str)这个方法,这个方法没别的,就是把$str经过
        //过滤和修剪后值给$this->uri_string属性,在这里暂时可以理解为就是赋值。

        //如果脚本是在命令行模式下运行的话,那么参数就是通过$_SERVER['argv']来传递。下面的
        //$this->_parse_cli_args();就是拿到符合我们需要的路由相关的一些参数鸟~如果大部分
        //情况你没用命令行执行脚本的话,下面这个if暂时可以不用管。
		if (php_sapi_name() == 'cli' or defined('STDIN'))
		{
			$this->_set_uri_string($this->_parse_cli_args());
			return;
		}

		// Let's try the REQUEST_URI first, this will work in most situations
		// 这种REQUEST_URI方式相对复杂一点,因此封装在$this->_detect_uri(); 里面。
        // 其实大多数情况下,利用REQUEST URI和SCRIPT NAME都会得到我们想要的路径信息了。
		if ($uri = $this->_detect_uri())
		{
			$this->_set_uri_string($uri);
			return;
		}

		// Is there a PATH_INFO variable?
		// Note: some servers seem to have trouble with getenv() so we'll test it two ways
		// PATH_INFO方式,个人觉得这种方式最经济,只是不是每次请求都有$_SERVER['PATH_INFO']这个变量。
		$path = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO');
		if (trim($path, '/') != '' && $path != "/".SELF)
		{
			$this->_set_uri_string($path);
			return;
		}

		// No PATH_INFO?... What about QUERY_STRING?
		// 如果是用QUERY_STRING的话,路径格式一般为index.php?/controller/method/xxx/xxx
		$path =  (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING');
		if (trim($path, '/') != '')
		{
			$this->_set_uri_string($path);
			return;
		}

		// As a last ditch effort lets try using the $_GET array
		// 上面的方法都不行,那真是奇怪了。。所以尝试最后一种奇葩的方法,就是从$_GET里面把那个键名拿出来。
		if (is_array($_GET) && count($_GET) == 1 && trim(key($_GET), '/') != '')
		{
			$this->_set_uri_string(key($_GET));
			return;
		}

		// We've exhausted all our options...
		$this->uri_string = '';
		return;
	}
	
	// 这里是因为上面那个获得uri_protocol配置的语句写在if里面,然后又没赋值到某个变量,所以这里要再写一次了
    // 可能是因为大多数情况下,我们都是选择AUTO方式吧。
	$uri = strtoupper($this->config->item('uri_protocol'));
	
	//其实就是按规定的方式去找路径而已
	if ($uri == 'REQUEST_URI')
	{
		$this->_set_uri_string($this->_detect_uri());
		return;
	}
	elseif ($uri == 'CLI')
	{
		$this->_set_uri_string($this->_parse_cli_args());
		return;
	}
	
	//如果你在配置文件config.php里面把这个uri_protocol定义成一种上面都没有的方式,那么就会执行下面的代码。
    //意思是,就看$_SERVER有没有这个uri_protocol的变量了,有就给,没有就算了。
	$path = (isset($_SERVER[$uri])) ? $_SERVER[$uri] : @getenv($uri);
	$this->_set_uri_string($path);
}
?>


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...