CI框架源码解析9路由类文件Router.php

CI框架路由类将URI射影到对应的控制器和方法,大量代码处理的是自定义路由,功能如下:

 

(1)支持自定义路由规则

(2)支持回调函数

(3)支持使用HTTP动词

CI框架源码解析9路由类文件Router.php

 

 

1、 构造函数 __construct()

/*
	 * 构造函数
	 */
	public function __construct($routing = NULL)
	{
		$this->config =& load_class('Config', 'core');
		$this->uri =& load_class('URI', 'core');

		$this->enable_query_strings = ( ! is_cli() && $this->config->item('enable_query_strings') === TRUE);

		// 如果在index.php里指定控制器目录 那么动态路由将这个设置作为控制器的目录
        // 也就是说路由器在找控制器和方法时 在controller下/设置目录/ 下找

		is_array($routing) && isset($routing['directory']) && $this->set_directory($routing['directory']);

		// 核心功能  解析URI到$this->directory $this->class $this->method
		$this->_set_routing();


		if (is_array($routing))
		{
			empty($routing['controller']) OR $this->set_class($routing['controller']);
			empty($routing['function'])   OR $this->set_method($routing['function']);
		}

		log_message('info', 'Router Class Initialized');
	}

2、核心解析函数_set_routing()

 

/*
     * 设置路由
     */
	protected function _set_routing()
	{

	    // 加载路由配置文件route.php
		if (file_exists(APPPATH.'config/routes.php'))
		{
			include(APPPATH.'config/routes.php');
		}

		// 对应环境下的路由配置文件router.php
		if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/routes.php'))
		{
			include(APPPATH.'config/'.ENVIRONMENT.'/routes.php');
		}

		// 设置默认控制器
		if (isset($route) && is_array($route))
		{
			isset($route['default_controller']) && $this->default_controller = $route['default_controller'];
			isset($route['translate_uri_dashes']) && $this->translate_uri_dashes = $route['translate_uri_dashes'];
			unset($route['default_controller'], $route['translate_uri_dashes']);
			$this->routes = $route;
		}


		if ($this->enable_query_strings)
		{

			if ( ! isset($this->directory))
			{
				$_d = $this->config->item('directory_trigger');
				$_d = isset($_GET[$_d]) ? trim($_GET[$_d], " \t\n\r\0\x0B/") : '';

				if ($_d !== '')
				{
					$this->uri->filter_uri($_d);
					$this->set_directory($_d);
				}
			}

			$_c = trim($this->config->item('controller_trigger'));
			if ( ! empty($_GET[$_c]))
			{
				$this->uri->filter_uri($_GET[$_c]);
				$this->set_class($_GET[$_c]);

				$_f = trim($this->config->item('function_trigger'));
				if ( ! empty($_GET[$_f]))
				{
					$this->uri->filter_uri($_GET[$_f]);
					$this->set_method($_GET[$_f]);
				}

				$this->uri->rsegments = array(
					1 => $this->class,
					2 => $this->method
				);
			}
			else
			{
				$this->_set_default_controller();
			}

			return;
		}

		// 非querystring模式的走这里
		if ($this->uri->uri_string !== '')
		{
			$this->_parse_routes();
		}
		else
		{
			$this->_set_default_controller();
		}
	}