wanglizhong
2025-05-05 9b8a7157bb9c401de973a4107f74ff3e723ec156
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<?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;
    }
}