Parameters are now correctly passed on to sub-routes

This commit is contained in:
Simon Sessingø
2021-03-29 17:05:45 +02:00
parent b05bbccc28
commit d6d83ac5bd
3 changed files with 33 additions and 0 deletions

View File

@@ -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.

View File

@@ -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;

View File

@@ -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);
}
}