forked from hyperf/http-server
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRouteCollector.php
More file actions
156 lines (136 loc) · 4.75 KB
/
RouteCollector.php
File metadata and controls
156 lines (136 loc) · 4.75 KB
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
<?php
declare(strict_types=1);
/**
* This file is part of Hyperf.
*
* @link https://www.hyperf.io
* @document https://hyperf.wiki
* @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/
namespace Hyperf\HttpServer\Router;
use FastRoute\DataGenerator;
use FastRoute\RouteParser;
use Hyperf\HttpServer\MiddlewareManager;
class RouteCollector
{
protected string $currentGroupPrefix = '';
protected array $currentGroupOptions = [];
/**
* Constructs a route collector.
*/
public function __construct(protected RouteParser $routeParser, protected DataGenerator $dataGenerator, protected string $server = 'http')
{
}
/**
* Adds a route to the collection.
*
* The syntax used in the $route string depends on the used route parser.
*
* @param string|string[] $httpMethod
* @param array|string $handler
*/
public function addRoute(array|string $httpMethod, string $route, mixed $handler, array $options = []): void
{
$route = $this->currentGroupPrefix . $route;
$routeDataList = $this->routeParser->parse($route);
$options = $this->mergeOptions($this->currentGroupOptions, $options);
foreach ((array) $httpMethod as $method) {
$method = strtoupper($method);
foreach ($routeDataList as $routeData) {
$this->dataGenerator->addRoute($method, $routeData, new Handler($handler, $route, $options));
}
MiddlewareManager::addMiddlewares($this->server, $route, $method, $options['middleware'] ?? []);
}
}
/**
* Create a route group with a common prefix.
*
* All routes created by the passed callback will have the given group prefix prepended.
*/
public function addGroup(string $prefix, callable $callback, array $options = []): void
{
$previousGroupPrefix = $this->currentGroupPrefix;
$currentGroupOptions = $this->currentGroupOptions;
$this->currentGroupPrefix = $previousGroupPrefix . $prefix;
$this->currentGroupOptions = $this->mergeOptions($currentGroupOptions, $options);
$callback($this);
$this->currentGroupPrefix = $previousGroupPrefix;
$this->currentGroupOptions = $currentGroupOptions;
}
/**
* Adds a GET route to the collection.
*
* This is simply an alias of $this->addRoute('GET', $route, $handler)
* @param array|callable|null|string $handler
*/
public function get(string $route, mixed $handler, array $options = []): void
{
$this->addRoute('GET', $route, $handler, $options);
}
/**
* Adds a POST route to the collection.
*
* This is simply an alias of $this->addRoute('POST', $route, $handler)
* @param array|callable|null|string $handler
*/
public function post(string $route, mixed $handler, array $options = []): void
{
$this->addRoute('POST', $route, $handler, $options);
}
/**
* Adds a PUT route to the collection.
*
* This is simply an alias of $this->addRoute('PUT', $route, $handler)
* @param array|callable|null|string $handler
*/
public function put(string $route, mixed $handler, array $options = []): void
{
$this->addRoute('PUT', $route, $handler, $options);
}
/**
* Adds a DELETE route to the collection.
*
* This is simply an alias of $this->addRoute('DELETE', $route, $handler)
* @param array|callable|null|string $handler
*/
public function delete(string $route, mixed $handler, array $options = []): void
{
$this->addRoute('DELETE', $route, $handler, $options);
}
/**
* Adds a PATCH route to the collection.
*
* This is simply an alias of $this->addRoute('PATCH', $route, $handler)
* @param array|callable|null|string $handler
*/
public function patch(string $route, mixed $handler, array $options = []): void
{
$this->addRoute('PATCH', $route, $handler, $options);
}
/**
* Adds a HEAD route to the collection.
*
* This is simply an alias of $this->addRoute('HEAD', $route, $handler)
* @param array|callable|null|string $handler
*/
public function head(string $route, mixed $handler, array $options = []): void
{
$this->addRoute('HEAD', $route, $handler, $options);
}
/**
* Returns the collected route data, as provided by the data generator.
*/
public function getData(): array
{
return $this->dataGenerator->getData();
}
public function getRouteParser(): RouteParser
{
return $this->routeParser;
}
protected function mergeOptions(array $origin, array $options): array
{
return array_merge_recursive($origin, $options);
}
}