| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 | 
							- <?php
 
- /**
 
-  * The Router class
 
-  */
 
- class LtRouter
 
- {
 
- 	public $configHandle;
 
- 	public $routingTable;
 
- 	public $module;
 
- 	public $action;
 
- 	public function __construct()
 
- 	{
 
- 		if (! $this->configHandle instanceof LtConfig)
 
- 		{
 
- 			if (class_exists("LtObjectUtil"))
 
- 			{
 
- 				$this->configHandle = LtObjectUtil::singleton("LtConfig");
 
- 			}
 
- 			else
 
- 			{
 
- 				$this->configHandle = new LtConfig;
 
- 			}
 
- 		}
 
- 	}
 
- 	public function init()
 
- 	{
 
- 		$this->routingTable = $this->configHandle->get("router.routing_table");
 
- 		if (empty($this->routingTable))
 
- 		{
 
- 			$this->routingTable = array('pattern' => ":module/:action/*",
 
- 				'default' => array('module' => 'default', 'action' => 'index'),
 
- 				'reqs' => array('module' => '[a-zA-Z0-9\.\-_]+',
 
- 					'action' => '[a-zA-Z0-9\.\-_]+'
 
- 					),
 
- 				'varprefix' => ':',
 
- 				'delimiter' => '/',
 
- 				'postfix' => '',
 
- 				'protocol' => 'PATH_INFO', // REWRITE STANDARD
 
- 				);
 
- 		}
 
- 		$delimiter = $this->routingTable['delimiter'];
 
- 		$postfix = $this->routingTable['postfix'];
 
- 		$protocol = strtoupper($this->routingTable['protocol']);
 
- 		$module = '';
 
- 		$action = '';
 
- 		$params = array();
 
- 		// HTTP HTTPS
 
- 		if (isset($_SERVER['SERVER_PROTOCOL']))
 
- 		{
 
- 			if (isset($_SERVER['PATH_INFO']) && !empty($_SERVER['PATH_INFO']))
 
- 			{ 
 
- 				// 忽略后缀
 
- 				$url = rtrim($_SERVER['PATH_INFO'], "$postfix");
 
- 				$url = explode($delimiter, trim($url, "/"));
 
- 			}
 
- 			else if (isset($_SERVER['REQUEST_URI']))
 
- 			{
 
- 				if ('REWRITE' == $protocol)
 
- 				{
 
- 					if (0 == strcmp($_SERVER['REQUEST_URI'], $_SERVER['SCRIPT_NAME']))
 
- 					{
 
- 						$url = array();
 
- 					}
 
- 					else
 
- 					{
 
- 						$url = substr($_SERVER['REQUEST_URI'], strlen(pathinfo($_SERVER['SCRIPT_NAME'], PATHINFO_DIRNAME)));
 
- 						$url = rtrim($url, "$postfix");
 
- 						$url = explode($delimiter, trim($url, "/"));
 
- 					}
 
- 				}
 
- 				else if ('PATH_INFO' == $protocol)
 
- 				{
 
- 					$url = substr($_SERVER['REQUEST_URI'], strlen($_SERVER['SCRIPT_NAME']));
 
- 					$url = rtrim($url, "$postfix");
 
- 					$url = explode($delimiter, trim($url, "/"));
 
- 				}
 
- 				else //STANDARD
 
- 				{
 
- 					$url = array();
 
- 					foreach($_GET as $v)
 
- 					{
 
- 						$url[] = $v;
 
- 					}
 
- 				}
 
- 			}
 
- 			else
 
- 			{
 
- 				$url = array();
 
- 				foreach($_GET as $v)
 
- 				{
 
- 					$url[] = $v;
 
- 				}
 
- 			}
 
- 			$params = $this->matchingRoutingTable($url);
 
- 			$module = $params['module'];
 
- 			$action = $params['action'];
 
- 		}
 
- 		else
 
- 		{ 
 
- 			// CLI
 
- 			$i = 0;
 
- 			while (isset($_SERVER['argv'][$i]) && isset($_SERVER['argv'][$i + 1]))
 
- 			{
 
- 				if (("-m" == $_SERVER['argv'][$i] || "--module" == $_SERVER['argv'][$i]))
 
- 				{
 
- 					$module = $_SERVER['argv'][$i + 1];
 
- 				}
 
- 				else if (("-a" == $_SERVER['argv'][$i] || "--action" == $_SERVER['argv'][$i]))
 
- 				{
 
- 					$action = $_SERVER['argv'][$i + 1];
 
- 				}
 
- 				else
 
- 				{
 
- 					$key = $_SERVER['argv'][$i];
 
- 					$params[$key] = $_SERVER['argv'][$i + 1];
 
- 				}
 
- 				$i = $i + 2;
 
- 			}
 
- 		}
 
- 		// 如果$_GET中不存在配置的变量则添加
 
- 		foreach($params as $k => $v)
 
- 		{
 
- 			!isset($_GET[$k]) && $_GET[$k] = $v;
 
- 		}
 
- 		$this->module = $module;
 
- 		$this->action = $action;
 
- 	}
 
- 	/**
 
- 	 * url 匹配路由表
 
- 	 * 
 
- 	 * @param  $ [string|array] $url
 
- 	 * @return 
 
- 	 * @todo 修复导致$_GET多出属性的BUG
 
- 	 * @todo 如果是rewrite或者path_info模式,可能需要unset module和action两个$_GET变量
 
- 	 */
 
- 	public function matchingRoutingTable($url)
 
- 	{
 
- 		$ret = $this->routingTable['default']; //初始化返回值为路由默认值
 
- 		$reqs = $this->routingTable['reqs'];
 
- 		$delimiter = $this->routingTable['delimiter'];
 
- 		$varprefix = $this->routingTable['varprefix'];
 
- 		$postfix = $this->routingTable['postfix'];
 
- 		$pattern = explode($delimiter, trim($this->routingTable['pattern'], $delimiter));
 
- 		/**
 
- 		 * 预处理url
 
- 		 */
 
- 		if (is_string($url))
 
- 		{
 
- 			$url = rtrim($url, $postfix); //忽略后缀
 
- 			$url = explode($delimiter, trim($url, $delimiter));
 
- 		}
 
- 		foreach($pattern as $k => $v)
 
- 		{
 
- 			if ($v[0] == $varprefix)
 
- 			{ 
 
- 				// 变量
 
- 				$varname = substr($v, 1); 
 
- 				// 匹配变量
 
- 				if (isset($url[$k]))
 
- 				{
 
- 					if (isset($reqs[$varname]))
 
- 					{
 
- 						$regex = "/^{$reqs[$varname]}\$/i";
 
- 						if (preg_match($regex, $url[$k]))
 
- 						{
 
- 							$ret[$varname] = $url[$k];
 
- 						}
 
- 					}
 
- 				}
 
- 			}
 
- 			else if ($v[0] == '*')
 
- 			{
 
- 				// 通配符
 
- 				$pos = $k;
 
- 				while (isset($url[$pos]) && isset($url[$pos + 1]))
 
- 				{
 
- 					$ret[$url[$pos ++]] = urldecode($url[$pos]);
 
- 					$pos++;
 
- 				}
 
- 			}
 
- 			else
 
- 			{ 
 
- 				// 静态
 
- 			}
 
- 		}
 
- 		return $ret;
 
- 	}
 
- }
 
 
  |