123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- <?php
- class LtUrl
- {
- public $configHandle;
- public $routingTable;
- public $baseUrl;
- public function __construct()
- {
- if (! $this->configHandle instanceof LtConfig)
- {
- if (class_exists("LtObjectUtil", false))
- {
- $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
- );
- }
- $protocol = strtoupper($this->routingTable['protocol']);
- if ('REWRITE' == $protocol)
- {
- $this->baseUrl = pathinfo($_SERVER['SCRIPT_NAME'], PATHINFO_DIRNAME) . '/';
- }
- else if ('STANDARD' == $protocol)
- {
- $this->baseUrl = $_SERVER['PHP_SELF'];
- }
- else
- {
- $this->baseUrl = '';
- }
- }
- public function generate($module, $action, $args = array())
- {
- $args = array_merge(array('module' => $module, 'action' => $action), $args);
- $url = '';
- // $url = $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://';
- // $url .= $_SERVER['HTTP_HOST'];
- // $url .= $_SERVER['SERVER_PORT'] == '80' ? '' : ':'.$_SERVER['SERVER_PORT'];
- $url .= $this->baseUrl;
- $url .= $this->reverseMatchingRoutingTable($args);
- return $url;
- }
- /**
- * 将变量反向匹配路由表, 返回匹配后的url
- *
- * @param array $params
- * @return string
- */
- public function reverseMatchingRoutingTable($args)
- {
- $ret = $this->routingTable['pattern'];
- $default = $this->routingTable['default'];
- $reqs = $this->routingTable['reqs'];
- $delimiter = $this->routingTable['delimiter'];
- $varprefix = $this->routingTable['varprefix'];
- $postfix = $this->routingTable['postfix'];
- $protocol = strtoupper($this->routingTable['protocol']);
- if ('STANDARD' == $protocol)
- {
- return '?' . http_build_query($args, '', '&');
- }
- $pattern = explode($delimiter, trim($this->routingTable['pattern'], $delimiter));
- foreach($pattern as $k => $v)
- {
- if ($v[0] == $varprefix)
- {
- // 变量
- $varname = substr($v, 1);
- // 匹配变量
- if (isset($args[$varname]))
- {
- $regex = "/^{$reqs[$varname]}\$/i";
- if (preg_match($regex, $args[$varname]))
- {
- $ret = str_replace($v, $args[$varname], $ret);
- unset($args[$varname]);
- }
- }
- else if (isset($default[$varname]))
- {
- $ret = str_replace($v, $default[$varname], $ret);
- }
- }
- else if ($v[0] == '*')
- {
- // 通配符
- $tmp = '';
- foreach($args as $key => $value)
- {
- if (!isset($default[$key]))
- {
- $tmp .= $key . $delimiter . rawurlencode($value) . $delimiter;
- }
- }
- $tmp = rtrim($tmp, $delimiter);
- $ret = str_replace($v, $tmp, $ret);
- $ret = rtrim($ret, $delimiter);
- }
- else
- {
- // 静态
- }
- }
- if ('REWRITE' == $protocol)
- {
- $ret = $ret . $postfix;
- }
- else if ('PATH_INFO' == $protocol)
- {
- $ret = $_SERVER['SCRIPT_NAME'] . $delimiter . $ret . $postfix;
- }
- else
- {
- $ret = $ret . $postfix;
- }
- return $ret;
- }
- }
|