You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.7 KiB
88 lines
2.7 KiB
<?php |
|
|
|
namespace FastRoute\Dispatcher; |
|
|
|
use FastRoute\Dispatcher; |
|
|
|
abstract class RegexBasedAbstract implements Dispatcher |
|
{ |
|
/** @var mixed[][] */ |
|
protected $staticRouteMap = []; |
|
|
|
/** @var mixed[] */ |
|
protected $variableRouteData = []; |
|
|
|
/** |
|
* @return mixed[] |
|
*/ |
|
abstract protected function dispatchVariableRoute($routeData, $uri); |
|
|
|
public function dispatch($httpMethod, $uri) |
|
{ |
|
if (isset($this->staticRouteMap[$httpMethod][$uri])) { |
|
$handler = $this->staticRouteMap[$httpMethod][$uri]; |
|
return [self::FOUND, $handler, []]; |
|
} |
|
|
|
$varRouteData = $this->variableRouteData; |
|
if (isset($varRouteData[$httpMethod])) { |
|
$result = $this->dispatchVariableRoute($varRouteData[$httpMethod], $uri); |
|
if ($result[0] === self::FOUND) { |
|
return $result; |
|
} |
|
} |
|
|
|
// For HEAD requests, attempt fallback to GET |
|
if ($httpMethod === 'HEAD') { |
|
if (isset($this->staticRouteMap['GET'][$uri])) { |
|
$handler = $this->staticRouteMap['GET'][$uri]; |
|
return [self::FOUND, $handler, []]; |
|
} |
|
if (isset($varRouteData['GET'])) { |
|
$result = $this->dispatchVariableRoute($varRouteData['GET'], $uri); |
|
if ($result[0] === self::FOUND) { |
|
return $result; |
|
} |
|
} |
|
} |
|
|
|
// If nothing else matches, try fallback routes |
|
if (isset($this->staticRouteMap['*'][$uri])) { |
|
$handler = $this->staticRouteMap['*'][$uri]; |
|
return [self::FOUND, $handler, []]; |
|
} |
|
if (isset($varRouteData['*'])) { |
|
$result = $this->dispatchVariableRoute($varRouteData['*'], $uri); |
|
if ($result[0] === self::FOUND) { |
|
return $result; |
|
} |
|
} |
|
|
|
// Find allowed methods for this URI by matching against all other HTTP methods as well |
|
$allowedMethods = []; |
|
|
|
foreach ($this->staticRouteMap as $method => $uriMap) { |
|
if ($method !== $httpMethod && isset($uriMap[$uri])) { |
|
$allowedMethods[] = $method; |
|
} |
|
} |
|
|
|
foreach ($varRouteData as $method => $routeData) { |
|
if ($method === $httpMethod) { |
|
continue; |
|
} |
|
|
|
$result = $this->dispatchVariableRoute($routeData, $uri); |
|
if ($result[0] === self::FOUND) { |
|
$allowedMethods[] = $method; |
|
} |
|
} |
|
|
|
// If there are no allowed methods the route simply does not exist |
|
if ($allowedMethods) { |
|
return [self::METHOD_NOT_ALLOWED, $allowedMethods]; |
|
} |
|
|
|
return [self::NOT_FOUND]; |
|
} |
|
}
|
|
|