Completed
Push — 6.0 ( 192674...d803ad )
by liu
02:18
created

RuleName::getRuleItemInfo()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 5
nc 1
nop 1
dl 0
loc 7
ccs 5
cts 5
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
// +----------------------------------------------------------------------
3
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
4
// +----------------------------------------------------------------------
5
// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
6
// +----------------------------------------------------------------------
7
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
8
// +----------------------------------------------------------------------
9
// | Author: liu21st <[email protected]>
10
// +----------------------------------------------------------------------
11
declare (strict_types = 1);
12
13
namespace think\route;
14
15
/**
16
 * 路由标识管理类
17
 */
18
class RuleName
19
{
20
    /**
21
     * 路由标识
22
     * @var array
23
     */
24
    protected $item = [];
25
26
    /**
27
     * 路由规则
28
     * @var array
29
     */
30
    protected $rule = [];
31
32
    /**
33
     * 路由分组
34
     * @var array
35
     */
36
    protected $group = [];
37
38
    /**
39
     * 注册路由标识
40
     * @access public
41
     * @param  string   $name  路由标识
42
     * @param  RuleItem $ruleItem 路由规则
43
     * @param  bool     $first 是否优先
44
     * @return void
45
     */
46 12
    public function setName(string $name, RuleItem $ruleItem, bool $first = false): void
47
    {
48 12
        $name = strtolower($name);
49 12
        $item = $this->getRuleItemInfo($ruleItem);
50 12
        if ($first && isset($this->item[$name])) {
51
            array_unshift($this->item[$name], $item);
52
        } else {
53 12
            $this->item[$name][] = $item;
54
        }
55 12
    }
56
57
    /**
58
     * 注册路由分组标识
59
     * @access public
60
     * @param  string    $name  路由分组标识
61
     * @param  RuleGroup $group 路由分组
62
     * @return void
63
     */
64 3
    public function setGroup(string $name, RuleGroup $group): void
65
    {
66 3
        $this->group[strtolower($name)] = $group;
67 3
    }
68
69
    /**
70
     * 注册路由规则
71
     * @access public
72
     * @param  string   $rule  路由规则
73
     * @param  RuleItem $ruleItem 路由
74
     * @return void
75
     */
76 30
    public function setRule(string $rule, RuleItem $ruleItem): void
77
    {
78 30
        $route = $ruleItem->getRoute();
79
80 30
        if (is_string($route)) {
81 12
            $this->rule[$rule][$route] = $ruleItem;
82
        } else {
83 21
            $this->rule[$rule][] = $ruleItem;
84
        }
85 30
    }
86
87
    /**
88
     * 根据路由规则获取路由对象(列表)
89
     * @access public
90
     * @param  string $rule   路由标识
91
     * @return RuleItem[]
92
     */
93 3
    public function getRule(string $rule): array
94
    {
95 3
        return $this->rule[$rule] ?? [];
96
    }
97
98
    /**
99
     * 根据路由分组标识获取分组
100
     * @access public
101
     * @param  string $name 路由分组标识
102
     * @return RuleGroup|null
103
     */
104
    public function getGroup(string $name)
105
    {
106
        return $this->group[strtolower($name)] ?? null;
107
    }
108
109
    /**
110
     * 清空路由规则
111
     * @access public
112
     * @return void
113
     */
114
    public function clear(): void
115
    {
116
        $this->item = [];
117
        $this->rule = [];
118
    }
119
120
    /**
121
     * 获取全部路由列表
122
     * @access public
123
     * @return array
124
     */
125
    public function getRuleList(): array
126
    {
127
        $list = [];
128
129
        foreach ($this->rule as $rule => $rules) {
130
            foreach ($rules as $item) {
131
                $val = [];
132
133
                foreach (['method', 'rule', 'name', 'route', 'domain', 'pattern', 'option'] as $param) {
134
                    $call        = 'get' . $param;
135
                    $val[$param] = $item->$call();
136
                }
137
138
                if ($item->isMiss()) {
139
                    $val['rule'] .= '<MISS>';
140
                }
141
142
                $list[] = $val;
143
            }
144
        }
145
146
        return $list;
147
    }
148
149
    /**
150
     * 导入路由标识
151
     * @access public
152
     * @param  array $item 路由标识
153
     * @return void
154
     */
155
    public function import(array $item): void
156
    {
157
        $this->item = $item;
158
    }
159
160
    /**
161
     * 根据路由标识获取路由信息(用于URL生成)
162
     * @access public
163
     * @param  string $name   路由标识
164
     * @param  string $domain 域名
165
     * @param  string $method 请求类型
166
     * @return array
167
     */
168 3
    public function getName(string $name = null, string $domain = null, string $method = '*'): array
169
    {
170 3
        if (is_null($name)) {
171
            return $this->item;
172
        }
173
174 3
        $name   = strtolower($name);
175 3
        $method = strtolower($method);
176 3
        $result = [];
177
178 3
        if (isset($this->item[$name])) {
179
            if (is_null($domain)) {
180
                $result = $this->item[$name];
181
            } else {
182
                foreach ($this->item[$name] as $item) {
183
                    $itemDomain = $item['domain'];
184
                    $itemMethod = $item['method'];
185
186
                    if (($itemDomain == $domain || '-' == $itemDomain) && ('*' == $itemMethod || '*' == $method || $method == $itemMethod)) {
187
                        $result[] = $item;
188
                    }
189
                }
190
            }
191
        }
192
193 3
        return $result;
194
    }
195
196
    /**
197
     * 获取路由信息
198
     * @access protected
199
     * @param  RuleItem $item 路由规则
200
     * @return array
201
     */
202 12
    protected function getRuleItemInfo(RuleItem $item): array
203
    {
204
        return [
205 12
            'rule'   => $item->getRule(),
206 12
            'domain' => $item->getDomain(),
207 12
            'method' => $item->getMethod(),
208 12
            'suffix' => $item->getSuffix(),
209
        ];
210
    }
211
}
212