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] 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