From 53e5b5362ff628863dad1c2c81e9b932e821c125 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Sessing=C3=B8?= Date: Sat, 4 Jun 2016 18:20:46 +0200 Subject: [PATCH] Development - Enhanced regular expression used for matching parameters. - Added basic unit-tests for parameters. - Fixed typos in PHP-docs and other minor optimizations. --- src/Pecee/SimpleRouter/RouterBase.php | 24 ++++++----------- src/Pecee/SimpleRouter/RouterEntry.php | 17 +++++------- src/Pecee/SimpleRouter/RouterRoute.php | 2 +- test/Dummy/DummyController.php | 5 ++++ test/RouterRouteTest.php | 36 ++++++++++++++++++++++++++ 5 files changed, 56 insertions(+), 28 deletions(-) diff --git a/src/Pecee/SimpleRouter/RouterBase.php b/src/Pecee/SimpleRouter/RouterBase.php index 46b80cb..ba0612a 100644 --- a/src/Pecee/SimpleRouter/RouterBase.php +++ b/src/Pecee/SimpleRouter/RouterBase.php @@ -72,12 +72,14 @@ class RouterBase { array_push($newPrefixes, trim($route->getPrefix(), '/')); } + /* @var $group RouterGroup */ + $group = null; + if(!($route instanceof RouterGroup)) { if(is_array($newPrefixes) && count($newPrefixes) && $backStack) { $route->setUrl( '/' . join('/', $newPrefixes) . $route->getUrl() ); } - $group = null; $this->controllerUrlMap[] = $route; } @@ -86,11 +88,11 @@ class RouterBase { if($route instanceof RouterGroup && is_callable($route->getCallback())) { $group = $route; - $route->renderRoute($this->request); - $mergedSettings = array_merge($settings, $route->getMergeableSettings()); + $group->renderRoute($this->request); + $mergedSettings = array_merge($settings, $group->getMergeableSettings()); // Add ExceptionHandler - if($route->matchRoute($this->request) && $route->getExceptionHandler() !== null) { + if($group->matchRoute($this->request) && $group->getExceptionHandler() !== null) { $this->exceptionHandlers[] = $route; } } @@ -131,14 +133,6 @@ class RouterBase { // Loop through each route-request $this->processRoutes($this->routes); - // Make sure routes with longer urls are rendered first - usort($this->controllerUrlMap, function($a, $b) { - if(strlen($a->getUrl()) < strlen($b->getUrl())) { - return 1; - } - return -1; - }); - $routeNotAllowed = false; $max = count($this->controllerUrlMap); @@ -186,7 +180,7 @@ class RouterBase { protected function handleException(\Exception $e) { - /* @var $route RouterEntry */ + /* @var $route RouterGroup */ foreach ($this->exceptionHandlers as $route) { $route->loadMiddleware($this->request); $handler = $route->getExceptionHandler(); @@ -300,9 +294,7 @@ class RouterBase { if(is_array($getParams)) { if ($includeEmpty === false) { $getParams = array_filter($getParams, function ($item) { - if (!empty($item)) { - return $item; - } + return (!empty($item)); }); } diff --git a/src/Pecee/SimpleRouter/RouterEntry.php b/src/Pecee/SimpleRouter/RouterEntry.php index 8e36a46..895f1f9 100644 --- a/src/Pecee/SimpleRouter/RouterEntry.php +++ b/src/Pecee/SimpleRouter/RouterEntry.php @@ -232,7 +232,7 @@ abstract class RouterEntry { } /** - * Dynamicially set settings value + * Dynamically set settings value * * @param string $name * @param mixed|null $value @@ -261,12 +261,6 @@ abstract class RouterEntry { $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) === '/') { @@ -285,10 +279,10 @@ abstract class RouterEntry { if($lastCharacter === '?') { $parameter = substr($parameter, 0, strlen($parameter)-1); - $regex .= '(?:\\/?(?P<'.$parameter.'>[^\/]+)?\\/?)'; + $regex .= '(?:\/?(?P<' . $parameter . '>'. $parameterRegex .')[^\/]?)?'; $required = false; } else { - $regex .= '.*?(?P<' . $parameter . '>'. $parameterRegex .').*?'; + $regex .= '\/?(?P<' . $parameter . '>'. $parameterRegex .')[^\/]?'; } $parameterNames[] = array('name' => $parameter, 'required' => $required); $parameter = ''; @@ -307,7 +301,8 @@ abstract class RouterEntry { $parameterValues = array(); - if(preg_match('/^'.$regex.'.?$/is', $url, $parameterValues)) { + if(preg_match('/^'.$regex.'$/is', $url, $parameterValues)) { + $parameters = array(); $max = count($parameterNames); @@ -399,7 +394,7 @@ abstract class RouterEntry { } /** - * Get allowed requeset methods + * Get allowed request methods * * @return array */ diff --git a/src/Pecee/SimpleRouter/RouterRoute.php b/src/Pecee/SimpleRouter/RouterRoute.php index acc112d..08b6581 100644 --- a/src/Pecee/SimpleRouter/RouterRoute.php +++ b/src/Pecee/SimpleRouter/RouterRoute.php @@ -105,7 +105,7 @@ class RouterRoute extends RouterEntry { } else { return strtolower($this->getAlias()) === strtolower($name); } - + return false; } diff --git a/test/Dummy/DummyController.php b/test/Dummy/DummyController.php index be3254b..019dd0d 100644 --- a/test/Dummy/DummyController.php +++ b/test/Dummy/DummyController.php @@ -6,4 +6,9 @@ class DummyController { echo static::class . '@' .'start() OK'; } + public function param($params = null) { + $params = func_get_args(); + echo 'Params: ' . join(', ', $params); + } + } \ No newline at end of file diff --git a/test/RouterRouteTest.php b/test/RouterRouteTest.php index 01984ae..bdac4aa 100644 --- a/test/RouterRouteTest.php +++ b/test/RouterRouteTest.php @@ -66,4 +66,40 @@ class RouterRouteTest extends PHPUnit_Framework_TestCase { } + public function testSimpleParam() { + + \Pecee\SimpleRouter\RouterBase::reset(); + + \Pecee\Http\Request::getInstance()->setMethod('get'); + \Pecee\Http\Request::getInstance()->setUri('/test-param1'); + + \Pecee\SimpleRouter\SimpleRouter::get('/test-{param1}', 'DummyController@param'); + \Pecee\SimpleRouter\SimpleRouter::start(); + + } + + public function testMultiParam() { + + \Pecee\SimpleRouter\RouterBase::reset(); + + \Pecee\Http\Request::getInstance()->setMethod('get'); + \Pecee\Http\Request::getInstance()->setUri('/test-param1-param2'); + + \Pecee\SimpleRouter\SimpleRouter::get('/test-{param1}-{param2}', 'DummyController@param'); + \Pecee\SimpleRouter\SimpleRouter::start(); + + } + + public function testPathParam() { + + \Pecee\SimpleRouter\RouterBase::reset(); + + \Pecee\Http\Request::getInstance()->setMethod('get'); + \Pecee\Http\Request::getInstance()->setUri('/test/path/param1'); + + \Pecee\SimpleRouter\SimpleRouter::get('/test/path/{param}', 'DummyController@param'); + \Pecee\SimpleRouter\SimpleRouter::start(); + + } + } \ No newline at end of file