You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
3.3 KiB
PHP
143 lines
3.3 KiB
PHP
<?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;
|
|
}
|
|
}
|