forked from PHP/Router
Modify dynamic segments to a common placeholder to fix #1
This commit is contained in:
parent
c9e3c3a2d5
commit
1a2aeff1d4
|
@ -6,8 +6,10 @@ class SegmentRouter implements Router
|
|||
|
||||
public function add(string $method, string $route, callable $handler): Router
|
||||
{
|
||||
// Expand the route into segments
|
||||
$segments = explode('/', trim($route, '/'));
|
||||
// Expand the route into segments and make dynamic segments into a common placeholder
|
||||
$segments = array_map(function($segment) {
|
||||
return str_starts_with($segment, ':') ? ':x' : $segment;
|
||||
}, explode('/', trim($route, '/')));
|
||||
|
||||
// Push each segment into the routes array as a node
|
||||
$node = &$this->routes;
|
||||
|
@ -28,37 +30,37 @@ class SegmentRouter implements Router
|
|||
|
||||
// Traverse the routes array to find the handler
|
||||
foreach ($uriSegments as $segment) {
|
||||
// Check if the segment exists in the node, or if there's a dynamic segment
|
||||
if (!isset($node[$segment])) {
|
||||
$dynamicSegment = $this->matchDynamicSegment($node, $segment);
|
||||
if ($dynamicSegment) {
|
||||
$params[] = $segment;
|
||||
$node = $node[$dynamicSegment];
|
||||
} else {
|
||||
return 404;
|
||||
}
|
||||
} else {
|
||||
// Check if the segment exists in the node
|
||||
if (isset($node[$segment])) {
|
||||
$node = $node[$segment];
|
||||
} else {
|
||||
// Handle dynamic segments (starting with ":")
|
||||
$dynamicSegment = null;
|
||||
|
||||
// Loop through the node and find the first dynamic segment
|
||||
foreach ($node as $k => $v) {
|
||||
if (str_starts_with($k, ':')) {
|
||||
$dynamicSegment = $k;
|
||||
break; // Break early as we only need one match
|
||||
}
|
||||
}
|
||||
|
||||
// If no dynamic segment was found, return 404
|
||||
if ($dynamicSegment === null) return 404;
|
||||
|
||||
// Otherwise, store the parameter and move to the dynamic node
|
||||
$params[] = $segment;
|
||||
$node = $node[$dynamicSegment];
|
||||
}
|
||||
}
|
||||
|
||||
// If the HTTP method is not supported, return 405
|
||||
// Check if the HTTP method is supported
|
||||
if (!isset($node[$method])) return 405;
|
||||
|
||||
// Return the handler
|
||||
return [$node[$method], $params];
|
||||
// Return the handler and parameters
|
||||
return [$node[$method] , $params];
|
||||
}
|
||||
|
||||
// Look through a node to find a dynamic segment
|
||||
private function matchDynamicSegment(array $node, string $segment): string|false
|
||||
{
|
||||
foreach (array_keys($node) as $key) {
|
||||
// If the key starts with a :, it's a dynamic segment
|
||||
if (strpos($key, ':') === 0) return $key;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function clear(): Router
|
||||
{
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,10 +1,10 @@
|
|||
/
|
||||
├── /
|
||||
│ └── GET
|
||||
├── :slug
|
||||
├── :x
|
||||
│ └── GET
|
||||
├── tags
|
||||
│ └── GET
|
||||
└── tag
|
||||
└── :tag
|
||||
└── :x
|
||||
└── GET
|
||||
|
|
|
@ -1,22 +1,22 @@
|
|||
/
|
||||
├── authorizations
|
||||
│ ├── GET
|
||||
│ ├── :id
|
||||
│ ├── :x
|
||||
│ │ ├── GET
|
||||
│ │ └── DELETE
|
||||
│ └── POST
|
||||
├── applications
|
||||
│ └── :client_id
|
||||
│ └── :x
|
||||
│ └── tokens
|
||||
│ ├── :access_token
|
||||
│ ├── :x
|
||||
│ │ ├── GET
|
||||
│ │ └── DELETE
|
||||
│ └── DELETE
|
||||
├── events
|
||||
│ └── GET
|
||||
├── repos
|
||||
│ └── :owner
|
||||
│ └── :repo
|
||||
│ └── :x
|
||||
│ └── :x
|
||||
│ ├── events
|
||||
│ │ └── GET
|
||||
│ ├── notifications
|
||||
|
@ -32,27 +32,27 @@
|
|||
│ │ └── DELETE
|
||||
│ ├── git
|
||||
│ │ ├── blobs
|
||||
│ │ │ ├── :sha
|
||||
│ │ │ ├── :x
|
||||
│ │ │ │ └── GET
|
||||
│ │ │ └── POST
|
||||
│ │ ├── commits
|
||||
│ │ │ ├── :sha
|
||||
│ │ │ ├── :x
|
||||
│ │ │ │ └── GET
|
||||
│ │ │ └── POST
|
||||
│ │ ├── refs
|
||||
│ │ │ ├── GET
|
||||
│ │ │ └── POST
|
||||
│ │ ├── tags
|
||||
│ │ │ ├── :sha
|
||||
│ │ │ ├── :x
|
||||
│ │ │ │ └── GET
|
||||
│ │ │ └── POST
|
||||
│ │ └── trees
|
||||
│ │ ├── :sha
|
||||
│ │ ├── :x
|
||||
│ │ │ └── GET
|
||||
│ │ └── POST
|
||||
│ ├── issues
|
||||
│ │ ├── GET
|
||||
│ │ ├── :number
|
||||
│ │ ├── :x
|
||||
│ │ │ ├── GET
|
||||
│ │ │ ├── comments
|
||||
│ │ │ │ ├── GET
|
||||
|
@ -62,23 +62,23 @@
|
|||
│ │ │ └── labels
|
||||
│ │ │ ├── GET
|
||||
│ │ │ ├── POST
|
||||
│ │ │ ├── :name
|
||||
│ │ │ ├── :x
|
||||
│ │ │ │ └── DELETE
|
||||
│ │ │ ├── PUT
|
||||
│ │ │ └── DELETE
|
||||
│ │ └── POST
|
||||
│ ├── assignees
|
||||
│ │ ├── GET
|
||||
│ │ └── :assignee
|
||||
│ │ └── :x
|
||||
│ │ └── GET
|
||||
│ ├── labels
|
||||
│ │ ├── GET
|
||||
│ │ ├── :name
|
||||
│ │ ├── :x
|
||||
│ │ │ ├── GET
|
||||
│ │ │ └── DELETE
|
||||
│ │ └── POST
|
||||
│ ├── milestones
|
||||
│ │ ├── :number
|
||||
│ │ ├── :x
|
||||
│ │ │ ├── labels
|
||||
│ │ │ │ └── GET
|
||||
│ │ │ ├── GET
|
||||
|
@ -87,7 +87,7 @@
|
|||
│ │ └── POST
|
||||
│ ├── pulls
|
||||
│ │ ├── GET
|
||||
│ │ ├── :number
|
||||
│ │ ├── :x
|
||||
│ │ │ ├── GET
|
||||
│ │ │ ├── commits
|
||||
│ │ │ │ └── GET
|
||||
|
@ -111,22 +111,22 @@
|
|||
│ │ └── GET
|
||||
│ ├── branches
|
||||
│ │ ├── GET
|
||||
│ │ └── :branch
|
||||
│ │ └── :x
|
||||
│ │ └── GET
|
||||
│ ├── DELETE
|
||||
│ ├── collaborators
|
||||
│ │ ├── GET
|
||||
│ │ └── :user
|
||||
│ │ └── :x
|
||||
│ │ ├── GET
|
||||
│ │ ├── PUT
|
||||
│ │ └── DELETE
|
||||
│ ├── comments
|
||||
│ │ ├── GET
|
||||
│ │ └── :id
|
||||
│ │ └── :x
|
||||
│ │ ├── GET
|
||||
│ │ └── DELETE
|
||||
│ ├── commits
|
||||
│ │ ├── :sha
|
||||
│ │ ├── :x
|
||||
│ │ │ ├── comments
|
||||
│ │ │ │ ├── GET
|
||||
│ │ │ │ └── POST
|
||||
|
@ -136,13 +136,13 @@
|
|||
│ │ └── GET
|
||||
│ ├── keys
|
||||
│ │ ├── GET
|
||||
│ │ ├── :id
|
||||
│ │ ├── :x
|
||||
│ │ │ ├── GET
|
||||
│ │ │ └── DELETE
|
||||
│ │ └── POST
|
||||
│ ├── downloads
|
||||
│ │ ├── GET
|
||||
│ │ └── :id
|
||||
│ │ └── :x
|
||||
│ │ ├── GET
|
||||
│ │ └── DELETE
|
||||
│ ├── forks
|
||||
|
@ -150,7 +150,7 @@
|
|||
│ │ └── POST
|
||||
│ ├── hooks
|
||||
│ │ ├── GET
|
||||
│ │ ├── :id
|
||||
│ │ ├── :x
|
||||
│ │ │ ├── GET
|
||||
│ │ │ ├── tests
|
||||
│ │ │ │ └── POST
|
||||
|
@ -160,7 +160,7 @@
|
|||
│ │ └── POST
|
||||
│ ├── releases
|
||||
│ │ ├── GET
|
||||
│ │ ├── :id
|
||||
│ │ ├── :x
|
||||
│ │ │ ├── GET
|
||||
│ │ │ ├── DELETE
|
||||
│ │ │ └── assets
|
||||
|
@ -178,16 +178,16 @@
|
|||
│ │ └── punch_card
|
||||
│ │ └── GET
|
||||
│ └── statuses
|
||||
│ └── :ref
|
||||
│ └── :x
|
||||
│ ├── GET
|
||||
│ └── POST
|
||||
├── networks
|
||||
│ └── :owner
|
||||
│ └── :repo
|
||||
│ └── :x
|
||||
│ └── :x
|
||||
│ └── events
|
||||
│ └── GET
|
||||
├── orgs
|
||||
│ └── :org
|
||||
│ └── :x
|
||||
│ ├── events
|
||||
│ │ └── GET
|
||||
│ ├── issues
|
||||
|
@ -195,12 +195,12 @@
|
|||
│ ├── GET
|
||||
│ ├── members
|
||||
│ │ ├── GET
|
||||
│ │ └── :user
|
||||
│ │ └── :x
|
||||
│ │ ├── GET
|
||||
│ │ └── DELETE
|
||||
│ ├── public_members
|
||||
│ │ ├── GET
|
||||
│ │ └── :user
|
||||
│ │ └── :x
|
||||
│ │ ├── GET
|
||||
│ │ ├── PUT
|
||||
│ │ └── DELETE
|
||||
|
@ -211,7 +211,7 @@
|
|||
│ ├── GET
|
||||
│ └── POST
|
||||
├── users
|
||||
│ ├── :user
|
||||
│ ├── :x
|
||||
│ │ ├── received_events
|
||||
│ │ │ ├── GET
|
||||
│ │ │ └── public
|
||||
|
@ -221,7 +221,7 @@
|
|||
│ │ │ ├── public
|
||||
│ │ │ │ └── GET
|
||||
│ │ │ └── orgs
|
||||
│ │ │ └── :org
|
||||
│ │ │ └── :x
|
||||
│ │ │ └── GET
|
||||
│ │ ├── starred
|
||||
│ │ │ └── GET
|
||||
|
@ -238,7 +238,7 @@
|
|||
│ │ │ └── GET
|
||||
│ │ ├── following
|
||||
│ │ │ ├── GET
|
||||
│ │ │ └── :target_user
|
||||
│ │ │ └── :x
|
||||
│ │ │ └── GET
|
||||
│ │ └── keys
|
||||
│ │ └── GET
|
||||
|
@ -249,7 +249,7 @@
|
|||
│ ├── GET
|
||||
│ ├── PUT
|
||||
│ └── threads
|
||||
│ └── :id
|
||||
│ └── :x
|
||||
│ ├── GET
|
||||
│ └── subscription
|
||||
│ ├── GET
|
||||
|
@ -258,15 +258,15 @@
|
|||
├── user
|
||||
│ ├── starred
|
||||
│ │ ├── GET
|
||||
│ │ └── :owner
|
||||
│ │ └── :repo
|
||||
│ │ └── :x
|
||||
│ │ └── :x
|
||||
│ │ ├── GET
|
||||
│ │ ├── PUT
|
||||
│ │ └── DELETE
|
||||
│ ├── subscriptions
|
||||
│ │ ├── GET
|
||||
│ │ └── :owner
|
||||
│ │ └── :repo
|
||||
│ │ └── :x
|
||||
│ │ └── :x
|
||||
│ │ ├── GET
|
||||
│ │ ├── PUT
|
||||
│ │ └── DELETE
|
||||
|
@ -288,19 +288,19 @@
|
|||
│ │ └── GET
|
||||
│ ├── following
|
||||
│ │ ├── GET
|
||||
│ │ └── :user
|
||||
│ │ └── :x
|
||||
│ │ ├── GET
|
||||
│ │ ├── PUT
|
||||
│ │ └── DELETE
|
||||
│ └── keys
|
||||
│ ├── GET
|
||||
│ ├── :id
|
||||
│ ├── :x
|
||||
│ │ ├── GET
|
||||
│ │ └── DELETE
|
||||
│ └── POST
|
||||
├── gists
|
||||
│ ├── GET
|
||||
│ ├── :id
|
||||
│ ├── :x
|
||||
│ │ ├── GET
|
||||
│ │ ├── star
|
||||
│ │ │ ├── PUT
|
||||
|
@ -317,7 +317,7 @@
|
|||
├── gitignore
|
||||
│ └── templates
|
||||
│ ├── GET
|
||||
│ └── :name
|
||||
│ └── :x
|
||||
│ └── GET
|
||||
├── markdown
|
||||
│ ├── POST
|
||||
|
@ -328,19 +328,19 @@
|
|||
├── rate_limit
|
||||
│ └── GET
|
||||
├── teams
|
||||
│ └── :id
|
||||
│ └── :x
|
||||
│ ├── GET
|
||||
│ ├── DELETE
|
||||
│ ├── members
|
||||
│ │ ├── GET
|
||||
│ │ └── :user
|
||||
│ │ └── :x
|
||||
│ │ ├── GET
|
||||
│ │ ├── PUT
|
||||
│ │ └── DELETE
|
||||
│ └── repos
|
||||
│ ├── GET
|
||||
│ └── :owner
|
||||
│ └── :repo
|
||||
│ └── :x
|
||||
│ └── :x
|
||||
│ ├── GET
|
||||
│ ├── PUT
|
||||
│ └── DELETE
|
||||
|
@ -358,19 +358,19 @@
|
|||
└── legacy
|
||||
├── issues
|
||||
│ └── search
|
||||
│ └── :owner
|
||||
│ └── :repository
|
||||
│ └── :state
|
||||
│ └── :keyword
|
||||
│ └── :x
|
||||
│ └── :x
|
||||
│ └── :x
|
||||
│ └── :x
|
||||
│ └── GET
|
||||
├── repos
|
||||
│ └── search
|
||||
│ └── :keyword
|
||||
│ └── :x
|
||||
│ └── GET
|
||||
└── user
|
||||
├── search
|
||||
│ └── :keyword
|
||||
│ └── :x
|
||||
│ └── GET
|
||||
└── email
|
||||
└── :email
|
||||
└── :x
|
||||
└── GET
|
||||
|
|
Loading…
Reference in New Issue
Block a user