[FEATURE] Added sub-domain routing.

- Updated documentation.
This commit is contained in:
Simon Sessingø
2015-12-10 03:31:57 +01:00
parent 2128a24f1c
commit c74d83796f
5 changed files with 119 additions and 77 deletions
+3 -2
View File
@@ -60,12 +60,12 @@ class RouterBase {
}
$newPrefixes = $prefixes;
$mergedSettings = array_merge($settings, $route->getMergeableSettings());
if($route->getPrefix()) {
array_push($newPrefixes, rtrim($route->getPrefix(), '/'));
}
$route->addSettings($mergedSettings);
$route->addSettings($settings);
if(!($route instanceof RouterGroup)) {
if(is_array($newPrefixes) && count($newPrefixes) && $backstack) {
@@ -79,6 +79,7 @@ class RouterBase {
if($route instanceof RouterGroup && is_callable($route->getCallback())) {
$route->renderRoute($this->request);
$activeGroup = $route;
$mergedSettings = array_merge($settings, $route->getMergeableSettings());
}
$this->currentRoute = null;
+79 -3
View File
@@ -23,13 +23,12 @@ abstract class RouterEntry {
protected $settings;
protected $callback;
protected $parameters;
public function __construct() {
$this->settings = array();
$this->settings['requestMethods'] = array();
$this->settings['parametersRegex'] = array();
$this->parameters = array();
$this->settings['parameters'] = array();
}
/**
@@ -216,7 +215,7 @@ abstract class RouterEntry {
}
/**
* Dynamicially access settings value
* Dynamically access settings value
*
* @param $name
* @return mixed|null
@@ -243,6 +242,83 @@ abstract class RouterEntry {
return new $name();
}
protected function parseParameters($route, $url, $parameterRegex = '[a-z0-9]*?') {
$parameterNames = array();
$regex = '';
$lastCharacter = '';
$isParameter = false;
$parameter = '';
// Use custom parameter regex if it exists
if(is_array($this->parametersRegex) && isset($this->parametersRegex[$parameter])) {
$parameterRegex = $this->parametersRegex[$parameter];
}
for($i = 0; $i < strlen($route); $i++) {
$character = $route[$i];
// Skip "/" if we are at the end of a parameter
if($lastCharacter === '}' && $character === '/') {
$lastCharacter = $character;
continue;
}
if($character === '{') {
// Remove "/" and "\" from regex
if(substr($regex, strlen($regex)-1) === '/') {
$regex = substr($regex, 0, strlen($regex) - 2);
}
$isParameter = true;
} elseif($isParameter && $character === '}') {
$required = true;
// Check for optional parameter
if($lastCharacter === '?') {
$parameter = substr($parameter, 0, strlen($parameter)-1);
$regex .= '(?:(?:\/{0,1}(?P<'.$parameter.'>'.$parameterRegex.')){0,1}\\/{0,1})';
$required = false;
} else {
$regex .= '(?:\\/{0,1}(?P<' . $parameter . '>'. $parameterRegex .')\\/{0,1})';
}
$parameterNames[] = array('name' => $parameter, 'required' => $required);
$parameter = '';
$isParameter = false;
} elseif($isParameter) {
$parameter .= $character;
} elseif($character === '/') {
$regex .= '\\' . $character;
} else {
$regex .= str_replace('.', '\\.', $character);
}
$lastCharacter = $character;
}
$parameterValues = array();
if(preg_match('/^'.$regex.'$/is', $url, $parameterValues)) {
$parameters = array();
if(count($parameterNames)) {
foreach($parameterNames as $name) {
$parameterValue = (isset($parameterValues[$name['name']]) && !empty($parameterValues[$name['name']])) ? $parameterValues[$name['name']] : null;
if($name['required'] && $parameterValue === null) {
throw new RouterException('Missing required parameter ' . $name['name'], 404);
}
$parameters[$name['name']] = $parameterValue;
}
}
return $parameters;
}
return null;
}
public function loadMiddleware(Request $request) {
if($this->getMiddleware()) {
if(is_array($this->getMiddleware())) {
+13
View File
@@ -10,6 +10,17 @@ class RouterGroup extends RouterEntry {
parent::__construct();
}
protected function matchDomain() {
if($this->domain !== null) {
$parameters = $this->parseParameters($this->domain, request()->getHost(), '[^.]*');
if($parameters !== null) {
$this->parameters = $parameters;
}
}
}
public function renderRoute(Request $request) {
// Check if request method is allowed
$hasAccess = (!$this->method);
@@ -26,6 +37,8 @@ class RouterGroup extends RouterEntry {
throw new RouterException('Method not allowed');
}
$this->matchDomain();
return parent::renderRoute($request);
}
+5 -69
View File
@@ -36,80 +36,16 @@ class RouterRoute extends RouterEntry {
// Make regular expression based on route
$route = rtrim($this->url, '/') . '/';
$parameterNames = array();
$regex = '';
$lastCharacter = '';
$isParameter = false;
$parameter = '';
$parameters = $this->parseParameters($route, $url);
for($i = 0; $i < strlen($route); $i++) {
if($parameters !== null) {
$character = $route[$i];
// Skip "/" if we are at the end of a parameter
if($lastCharacter === '}' && $character === '/') {
$lastCharacter = $character;
continue;
}
if($character === '{') {
// Remove "/" and "\" from regex
if(substr($regex, strlen($regex)-1) === '/') {
$regex = substr($regex, 0, strlen($regex) - 2);
}
$isParameter = true;
} elseif($isParameter && $character === '}') {
$required = true;
// Check for optional parameter
if($lastCharacter === '?') {
$parameter = substr($parameter, 0, strlen($parameter)-1);
$regex .= '(?:(?:\/{0,1}(?P<'.$parameter.'>[a-z0-9]*?)){0,1}\\/)';
$required = false;
} else {
// Use custom parameter regex if it exists
$parameterRegex = '[a-z0-9]*?';
if(is_array($this->parametersRegex) && isset($this->parametersRegex[$parameter])) {
$parameterRegex = $this->parametersRegex[$parameter];
}
$regex .= '(?:\\/{0,1}(?P<' . $parameter . '>'. $parameterRegex .')\\/)';
}
$parameterNames[] = array('name' => $parameter, 'required' => $required);
$parameter = '';
$isParameter = false;
} elseif($isParameter) {
$parameter .= $character;
} elseif($character === '/') {
$regex .= '\\' . $character;
if(is_array($this->parameters)) {
$this->parameters = array_merge($this->parameters, $parameters);
} else {
$regex .= $character;
$this->parameters = $parameters;
}
$lastCharacter = $character;
}
$parameterValues = array();
if(preg_match('/^'.$regex.'$/is', $url, $parameterValues)) {
$parameters = array();
if(count($parameterNames)) {
foreach($parameterNames as $name) {
$parameterValue = (isset($parameterValues[$name['name']]) && !empty($parameterValues[$name['name']])) ? $parameterValues[$name['name']] : null;
if($name['required'] && $parameterValue === null) {
throw new RouterException('Missing required parameter ' . $name['name'], 404);
}
$parameters[$name['name']] = $parameterValue;
}
}
$this->parameters = $parameters;
return $this;
}