[FEATURE] php8 compatibility.

- Fixed possible error causing parameters not to be set properly when using partialGroup.
- Removed unused import reference.
- Added unit-tests.
This commit is contained in:
Simon Sessingø
2021-03-29 15:11:58 +02:00
parent 5b99e98a24
commit 8eba5ab3d5
3 changed files with 54 additions and 10 deletions
@@ -31,7 +31,7 @@ class ClassLoader implements IClassLoader
*/ */
public function loadClosure(Callable $closure, array $parameters) public function loadClosure(Callable $closure, array $parameters)
{ {
return \call_user_func_array($closure, $parameters); return \call_user_func_array($closure, array_values($parameters));
} }
} }
+10 -9
View File
@@ -2,7 +2,6 @@
namespace Pecee\SimpleRouter\Route; namespace Pecee\SimpleRouter\Route;
use Pecee\Http\Middleware\IMiddleware;
use Pecee\Http\Request; use Pecee\Http\Request;
use Pecee\SimpleRouter\Exceptions\ClassNotFoundHttpException; use Pecee\SimpleRouter\Exceptions\ClassNotFoundHttpException;
use Pecee\SimpleRouter\Exceptions\NotFoundHttpException; use Pecee\SimpleRouter\Exceptions\NotFoundHttpException;
@@ -153,12 +152,22 @@ abstract class Route implements IRoute
if (isset($parameters[1]) === true) { if (isset($parameters[1]) === true) {
$groupParameters = $this->getGroup() !== null ? $this->getGroup()->getParameters() : [];
/* Only take matched parameters with name */ /* Only take matched parameters with name */
foreach ((array)$parameters[1] as $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; $values[$name] = (isset($matches[$name]) === true && $matches[$name] !== '') ? $matches[$name] : null;
} }
} }
$this->originalParameters = $values;
return $values; return $values;
} }
@@ -477,14 +486,6 @@ abstract class Route implements IRoute
*/ */
public function setParameters(array $parameters): 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); $this->parameters = array_merge($this->parameters, $parameters);
return $this; return $this;
@@ -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);
}
} }