Passed
Push — master ( d352f7...706a16 )
by 世昌
02:30
created

ApplicationSource::getRouteName()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 12
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 8
nc 4
nop 3
dl 0
loc 12
rs 10
c 0
b 0
f 0
1
<?php
2
namespace suda\application;
3
4
use function explode;
5
use function in_array;
6
use function strlen;
7
use function strrpos;
8
use suda\framework\Request;
9
10
/**
11
 * 应用源处理
12
 */
13
class ApplicationSource extends ApplicationBase
14
{
15
16
    /**
17
     * 获取URL
18
     *
19
     * @param Request $request
20
     * @param string $name
21
     * @param array $parameter
22
     * @param boolean $allowQuery
23
     * @param string|null $default
24
     * @param string|null $group
25
     * @return string|null
26
     */
27
    public function getUrl(
28
        Request $request,
29
        string $name,
30
        array $parameter = [],
31
        bool $allowQuery = true,
32
        ?string $default = null,
33
        ?string $group = null
34
    ):?string {
35
        $group = $group ?? $request->getAttribute('group');
36
        $default = $default ?? $request->getAttribute('module');
37
        $url = $this->route->create($this->getRouteName($name, $default, $group), $parameter, $allowQuery);
38
        return $this->getUrlIndex($request).'/'.ltrim($url, '/');
39
    }
40
41
    /**
42
     * 获取URL索引
43
     *
44
     * @param Request $request
45
     * @return string
46
     */
47
    protected function getUrlIndex(Request $request):string
48
    {
49
        $indexArray = $this->conf('index') ?? [ 'index.php' ];
50
        $index = ltrim($request->getIndex(), '/');
51
        if (!in_array($index, $indexArray)) {
52
            return $request->getIndex();
53
        }
54
        return '';
55
    }
56
57
    /**
58
     * 获取模板下的资源名
59
     *
60
     * @param string $name
61
     * @param string|null $default
62
     * @return string
63
     */
64
    public function getModuleSourceName(string $name, ?string $default = null):string
65
    {
66
        if (strpos($name, ':') > 0) {
67
            list($module, $group, $name) = $this->parseRouteName($name, $default);
68
        } else {
69
            $module = $default;
70
        }
71
        if ($module !== null && ($moduleObj = $this->find($module))) {
72
            return $moduleObj->getFullName().':'.$name;
73
        }
74
        return $name;
75
    }
76
77
    /**
78
     * 获取路由全名
79
     *
80
     * @param string $name
81
     * @param string|null $default
82
     * @param string|null $group
83
     * @return string
84
     */
85
    public function getRouteName(string $name, ?string $default = null, ?string $group = null):string
86
    {
87
        if (strpos($name, ':') !== false) {
88
            list($module, $group, $name) = $this->parseRouteName($name, $default, $group);
89
        } else {
90
            $module = $default;
91
        }
92
        $prefixGroup = $this->getRouteGroupPrefix($group);
93
        if ($module !== null && ($moduleObj = $this->find($module))) {
94
            return $moduleObj->getFullName().$prefixGroup.':'.$name;
95
        }
96
        return $name;
97
    }
98
99
    /**
100
     * 拆分路由名
101
     *
102
     * @param string $name
103
     * @param string|null $default
104
     * @param string|null $groupName
105
     * @return array
106
     */
107
    public function parseRouteName(string $name, ?string $default = null, ?string $groupName = null)
108
    {
109
        if (strpos($name, ':') !== false) {
110
            $dotpos = strrpos($name, ':');
111
            $module = substr($name, 0, $dotpos);
112
            $name = substr($name, $dotpos + 1);
113
            if (strlen($module) === 0) {
114
                $module = $default;
115
            }
116
        } else {
117
            $module = $default;
118
        }
119
        if ($module !== null && strpos($module, '@') !== false) {
120
            list($module, $groupName) = explode('@', $module, 2);
121
            $module = strlen($module) ? $module : $default;
122
        }
123
        return [$module, $groupName, $name];
124
    }
125
126
    /**
127
     * 获取基础URI
128
     *
129
     * @param Request $request
130
     * @param boolean $beautify
131
     * @return string
132
     */
133
    public function getUriBase(Request $request, bool $beautify = true):string
134
    {
135
        $index = $beautify ? $this->getUrlIndex($request) : $request->getIndex();
136
        return $request->getUriBase() . $index;
137
    }
138
139
    /**
140
     * 获取分组前缀
141
     *
142
     * @param string|null $group
143
     * @return string
144
     */
145
    protected function getRouteGroupPrefix(?string $group):string
146
    {
147
        return $group === null || $group === 'default' ? '': '@'. $group;
148
    }
149
}
150