From b05bbccc281ff33a5ddb3bddcbf7e0864394fb57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Sessing=C3=B8?= Date: Mon, 29 Mar 2021 16:56:37 +0200 Subject: [PATCH 1/3] [FEATURE] Added support for parameters in group prefix. --- src/Pecee/SimpleRouter/Route/RouteGroup.php | 12 ++++-- .../SimpleRouter/Route/RoutePartialGroup.php | 9 +---- tests/Pecee/SimpleRouter/RouterUrlTest.php | 37 +++++++++++++++++++ 3 files changed, 46 insertions(+), 12 deletions(-) diff --git a/src/Pecee/SimpleRouter/Route/RouteGroup.php b/src/Pecee/SimpleRouter/Route/RouteGroup.php index bdcf2e8..6520cc8 100644 --- a/src/Pecee/SimpleRouter/Route/RouteGroup.php +++ b/src/Pecee/SimpleRouter/Route/RouteGroup.php @@ -7,6 +7,7 @@ use Pecee\SimpleRouter\Handlers\IExceptionHandler; class RouteGroup extends Route implements IGroupRoute { + protected $urlRegex = '/^%s\/?/u'; protected $prefix; protected $name; protected $domains = []; @@ -55,16 +56,19 @@ class RouteGroup extends Route implements IGroupRoute return false; } - // Parse parameter + // Parse group prefix parameters + if(count($this->originalParameters) === 0) { + $this->parseParameters($this->prefix, $url); + } - $prefix = $this->prefix; + $parsedPrefix = $this->prefix; foreach ($this->getParameters() as $parameter => $value) { - $prefix = str_ireplace('{' . $parameter . '}', $value, $prefix); + $parsedPrefix = str_ireplace('{' . $parameter . '}', $value, $parsedPrefix); } /* Skip if prefix doesn't match */ - if ($this->prefix !== null && stripos($url, $prefix) === false) { + if ($this->prefix !== null && stripos($url, $parsedPrefix) === false) { return false; } diff --git a/src/Pecee/SimpleRouter/Route/RoutePartialGroup.php b/src/Pecee/SimpleRouter/Route/RoutePartialGroup.php index 1e1a51b..9960d29 100644 --- a/src/Pecee/SimpleRouter/Route/RoutePartialGroup.php +++ b/src/Pecee/SimpleRouter/Route/RoutePartialGroup.php @@ -6,14 +6,7 @@ use Pecee\Http\Request; class RoutePartialGroup extends RouteGroup implements IPartialGroupRoute { - - /** - * RoutePartialGroup constructor. - */ - public function __construct() - { - $this->urlRegex = '/^%s\/?/u'; - } + protected $urlRegex = '/^%s\/?/u'; /** * Method called to check if route matches diff --git a/tests/Pecee/SimpleRouter/RouterUrlTest.php b/tests/Pecee/SimpleRouter/RouterUrlTest.php index f9b0d4b..5da97de 100644 --- a/tests/Pecee/SimpleRouter/RouterUrlTest.php +++ b/tests/Pecee/SimpleRouter/RouterUrlTest.php @@ -271,4 +271,41 @@ class RouterUrlTest extends \PHPUnit\Framework\TestCase TestRouter::router()->reset(); } + public function testGroupPrefix() { + + $result = false; + + TestRouter::group(['prefix' => '/lang/{lang}'], function () use(&$result) { + + TestRouter::get('/test', function() use(&$result) { + $result = true; + }); + }); + + TestRouter::debug('/lang/da/test'); + + $this->assertTrue($result); + + // Test group prefix sub-route + + $result = null; + $expectedResult = 28; + + TestRouter::group(['prefix' => '/lang/{lang}'], function () use(&$result, $expectedResult) { + + TestRouter::get('/horse/{horseType}', function($horseType) use(&$result) { + $result = false; + }); + + TestRouter::get('/user/{userId}', function($userId) use(&$result, $expectedResult) { + $result = $userId; + }); + }); + + TestRouter::debug("/lang/da/user/$expectedResult"); + + $this->assertEquals($expectedResult, $result); + + } + } \ No newline at end of file From d6d83ac5bd636cace85bfdad4dc3151dc6163430 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Sessing=C3=B8?= Date: Mon, 29 Mar 2021 17:05:45 +0200 Subject: [PATCH 2/3] Parameters are now correctly passed on to sub-routes --- README.md | 10 ++++++++++ src/Pecee/SimpleRouter/Route/Route.php | 5 +++++ tests/Pecee/SimpleRouter/RouterUrlTest.php | 18 ++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/README.md b/README.md index 5e2e293..f8972d7 100644 --- a/README.md +++ b/README.md @@ -655,6 +655,16 @@ SimpleRouter::group(['prefix' => '/admin'], function () { }); ``` +You can also use parameters in your groups: + +```php +SimpleRouter::group(['prefix' => '/lang/{language}'], function ($language) { + SimpleRouter::get('/users', function () { + // Matches The "/admin/users" URL + }); +}); +``` + ## Partial groups Partial router groups has the same benefits as a normal group, but supports parameters and are only rendered once the url has matched. diff --git a/src/Pecee/SimpleRouter/Route/Route.php b/src/Pecee/SimpleRouter/Route/Route.php index 8761334..247e054 100644 --- a/src/Pecee/SimpleRouter/Route/Route.php +++ b/src/Pecee/SimpleRouter/Route/Route.php @@ -154,16 +154,21 @@ abstract class Route implements IRoute $groupParameters = $this->getGroup() !== null ? $this->getGroup()->getParameters() : []; + $lastParams = []; + /* Only take matched parameters with name */ foreach ((array)$parameters[1] as $name) { // Ignore parent parameters if(isset($groupParameters[$name]) === true) { + $lastParams[$name] = $matches[$name]; continue; } $values[$name] = (isset($matches[$name]) === true && $matches[$name] !== '') ? $matches[$name] : null; } + + $values = array_merge($values, $lastParams); } $this->originalParameters = $values; diff --git a/tests/Pecee/SimpleRouter/RouterUrlTest.php b/tests/Pecee/SimpleRouter/RouterUrlTest.php index 5da97de..7fb33ed 100644 --- a/tests/Pecee/SimpleRouter/RouterUrlTest.php +++ b/tests/Pecee/SimpleRouter/RouterUrlTest.php @@ -308,4 +308,22 @@ class RouterUrlTest extends \PHPUnit\Framework\TestCase } + public function testPassParameter() { + + $result = false; + $expectedLanguage = 'da'; + + TestRouter::group(['prefix' => '/lang/{lang}'], function () use(&$result, $expectedLanguage) { + + TestRouter::get('/test', function($language) use(&$result, $expectedLanguage) { + $result = $expectedLanguage; + }); + }); + + TestRouter::debug("/lang/$expectedLanguage/test"); + + $this->assertEquals($expectedLanguage, $result); + + } + } \ No newline at end of file From c423172c23dec22a906b0cf2ff6aa50955f74869 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Sessing=C3=B8?= Date: Mon, 29 Mar 2021 17:10:12 +0200 Subject: [PATCH 3/3] Added deep parameters pass unit-test --- tests/Pecee/SimpleRouter/RouterUrlTest.php | 32 ++++++++++++++++++---- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/tests/Pecee/SimpleRouter/RouterUrlTest.php b/tests/Pecee/SimpleRouter/RouterUrlTest.php index 7fb33ed..7e619a6 100644 --- a/tests/Pecee/SimpleRouter/RouterUrlTest.php +++ b/tests/Pecee/SimpleRouter/RouterUrlTest.php @@ -291,13 +291,13 @@ class RouterUrlTest extends \PHPUnit\Framework\TestCase $result = null; $expectedResult = 28; - TestRouter::group(['prefix' => '/lang/{lang}'], function () use(&$result, $expectedResult) { + TestRouter::group(['prefix' => '/lang/{lang}'], function () use(&$result) { TestRouter::get('/horse/{horseType}', function($horseType) use(&$result) { $result = false; }); - TestRouter::get('/user/{userId}', function($userId) use(&$result, $expectedResult) { + TestRouter::get('/user/{userId}', function($userId) use(&$result) { $result = $userId; }); }); @@ -313,11 +313,12 @@ class RouterUrlTest extends \PHPUnit\Framework\TestCase $result = false; $expectedLanguage = 'da'; - TestRouter::group(['prefix' => '/lang/{lang}'], function () use(&$result, $expectedLanguage) { + TestRouter::group(['prefix' => '/lang/{lang}'], function ($language) use(&$result) { - TestRouter::get('/test', function($language) use(&$result, $expectedLanguage) { - $result = $expectedLanguage; + TestRouter::get('/test', function($language) use(&$result) { + $result = $language; }); + }); TestRouter::debug("/lang/$expectedLanguage/test"); @@ -326,4 +327,25 @@ class RouterUrlTest extends \PHPUnit\Framework\TestCase } + public function testPassParameterDeep() { + + $result = false; + $expectedLanguage = 'da'; + + TestRouter::group(['prefix' => '/lang/{lang}'], function ($language) use(&$result) { + + TestRouter::group(['prefix' => '/admin'], function($language) use(&$result) { + TestRouter::get('/test', function($language) use(&$result) { + $result = $language; + }); + }); + + }); + + TestRouter::debug("/lang/$expectedLanguage/admin/test"); + + $this->assertEquals($expectedLanguage, $result); + + } + } \ No newline at end of file