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;
- }
- }
|