From 8eba5ab3d55d09700a86f94ea376ffda808097cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Sessing=C3=B8?= Date: Mon, 29 Mar 2021 15:11:58 +0200 Subject: [PATCH] [FEATURE] php8 compatibility. - Fixed possible error causing parameters not to be set properly when using partialGroup. - Removed unused import reference. - Added unit-tests. --- .../SimpleRouter/ClassLoader/ClassLoader.php | 2 +- src/Pecee/SimpleRouter/Route/Route.php | 19 ++++---- .../SimpleRouter/RouterPartialGroupTest.php | 43 +++++++++++++++++++ 3 files changed, 54 insertions(+), 10 deletions(-) diff --git a/src/Pecee/SimpleRouter/ClassLoader/ClassLoader.php b/src/Pecee/SimpleRouter/ClassLoader/ClassLoader.php index 027028e..0a11f83 100644 --- a/src/Pecee/SimpleRouter/ClassLoader/ClassLoader.php +++ b/src/Pecee/SimpleRouter/ClassLoader/ClassLoader.php @@ -31,7 +31,7 @@ class ClassLoader implements IClassLoader */ public function loadClosure(Callable $closure, array $parameters) { - return \call_user_func_array($closure, $parameters); + return \call_user_func_array($closure, array_values($parameters)); } } \ No newline at end of file diff --git a/src/Pecee/SimpleRouter/Route/Route.php b/src/Pecee/SimpleRouter/Route/Route.php index 72c96c6..42b6a2c 100644 --- a/src/Pecee/SimpleRouter/Route/Route.php +++ b/src/Pecee/SimpleRouter/Route/Route.php @@ -2,7 +2,6 @@ namespace Pecee\SimpleRouter\Route; -use Pecee\Http\Middleware\IMiddleware; use Pecee\Http\Request; use Pecee\SimpleRouter\Exceptions\ClassNotFoundHttpException; use Pecee\SimpleRouter\Exceptions\NotFoundHttpException; @@ -153,12 +152,22 @@ abstract class Route implements IRoute if (isset($parameters[1]) === true) { + $groupParameters = $this->getGroup() !== null ? $this->getGroup()->getParameters() : []; + /* Only take matched parameters with name */ foreach ((array)$parameters[1] as $name) { + + // Skip parent parameters + if(isset($groupParameters[$name]) === true) { + continue; + } + $values[$name] = (isset($matches[$name]) === true && $matches[$name] !== '') ? $matches[$name] : null; } } + $this->originalParameters = $values; + return $values; } @@ -477,14 +486,6 @@ abstract class Route implements IRoute */ public function setParameters(array $parameters): IRoute { - /* - * If this is the first time setting parameters we store them so we - * later can organize the array, in case somebody tried to sort the array. - */ - if (\count($parameters) !== 0 && \count($this->originalParameters) === 0) { - $this->originalParameters = $parameters; - } - $this->parameters = array_merge($this->parameters, $parameters); return $this; diff --git a/tests/Pecee/SimpleRouter/RouterPartialGroupTest.php b/tests/Pecee/SimpleRouter/RouterPartialGroupTest.php index 40e288a..df78d9f 100644 --- a/tests/Pecee/SimpleRouter/RouterPartialGroupTest.php +++ b/tests/Pecee/SimpleRouter/RouterPartialGroupTest.php @@ -70,4 +70,47 @@ class RouterPartialGroupTest extends \PHPUnit\Framework\TestCase } + public function testPhp8CallUserFunc() { + + TestRouter::router()->reset(); + + $result = false; + $lang = 'de'; + + TestRouter::group(['prefix' => '/lang'], function() use(&$result) { + TestRouter::get('/{lang}', function ($lang) use(&$result) { + $result = $lang; + }); + }); + + TestRouter::debug("/lang/$lang"); + + $this->assertEquals($lang, $result); + + // Test partial group + + $lang = 'de'; + $userId = 22; + + $result1 = false; + $result2 = false; + + TestRouter::partialGroup( + '/lang/{lang}/', + function ($lang) use(&$result1, &$result2) { + + $result1 = $lang; + + TestRouter::get('/user/{userId}', function ($userId) use(&$result2) { + $result2 = $userId; + }); + }); + + TestRouter::debug("/lang/$lang/user/$userId"); + + $this->assertEquals($lang, $result1); + $this->assertEquals($userId, $result2); + + } + } \ No newline at end of file