From b2851e41f10da0cd57107ce38075de99851c18a7 Mon Sep 17 00:00:00 2001 From: Pascal Pirschel Date: Fri, 5 May 2023 13:40:38 +0200 Subject: [PATCH 1/2] Fixed Route::setUrl() behavior When there are no parameters in the url, correctly empty the routes parameter array --- .../SimpleRouter/Route/LoadableRoute.php | 4 ++- .../Dummy/Route/DummyLoadableRoute.php | 11 ++++++++ .../Pecee/SimpleRouter/LoadableRouteTest.php | 27 +++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 tests/Pecee/SimpleRouter/Dummy/Route/DummyLoadableRoute.php create mode 100644 tests/Pecee/SimpleRouter/LoadableRouteTest.php diff --git a/src/Pecee/SimpleRouter/Route/LoadableRoute.php b/src/Pecee/SimpleRouter/Route/LoadableRoute.php index 7c93a60..9d7a593 100644 --- a/src/Pecee/SimpleRouter/Route/LoadableRoute.php +++ b/src/Pecee/SimpleRouter/Route/LoadableRoute.php @@ -82,14 +82,16 @@ abstract class LoadableRoute extends Route implements ILoadableRoute { $this->url = ($url === '/') ? '/' : '/' . trim($url, '/') . '/'; + $parameters = []; if (strpos($this->url, $this->paramModifiers[0]) !== false) { $regex = sprintf(static::PARAMETERS_REGEX_FORMAT, $this->paramModifiers[0], $this->paramOptionalSymbol, $this->paramModifiers[1]); if ((bool)preg_match_all('/' . $regex . '/u', $this->url, $matches) !== false) { - $this->parameters = array_fill_keys($matches[1], null); + $parameters = array_fill_keys($matches[1], null); } } + $this->parameters = $parameters; return $this; } diff --git a/tests/Pecee/SimpleRouter/Dummy/Route/DummyLoadableRoute.php b/tests/Pecee/SimpleRouter/Dummy/Route/DummyLoadableRoute.php new file mode 100644 index 0000000..8361c05 --- /dev/null +++ b/tests/Pecee/SimpleRouter/Dummy/Route/DummyLoadableRoute.php @@ -0,0 +1,11 @@ +assertEmpty($route->getParameters()); + + $route->setUrl('/'); + $this->assertEmpty($route->getParameters()); + + $expected = ['param' => null, 'optionalParam' => null]; + $route->setUrl('/{param}/{optionalParam?}'); + $this->assertEquals($expected, $route->getParameters()); + + $expected = ['otherParam' => null]; + $route->setUrl('/{otherParam}'); + $this->assertEquals($expected, $route->getParameters()); + + $expected = []; + $route->setUrl('/'); + $this->assertEquals($expected, $route->getParameters()); + } +} \ No newline at end of file From f3c6015a59d8e90dcde4a813eff96a58bab9f653 Mon Sep 17 00:00:00 2001 From: sessingo Date: Sat, 6 May 2023 17:29:33 +0200 Subject: [PATCH 2/2] Fixed Resource-type not respecting parameters when using getUrl (issue: #666) --- .../SimpleRouter/Route/RouteResource.php | 47 ++++++++++--------- .../Pecee/SimpleRouter/RouterResourceTest.php | 16 +++++++ 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/src/Pecee/SimpleRouter/Route/RouteResource.php b/src/Pecee/SimpleRouter/Route/RouteResource.php index 7ec6307..b66b796 100644 --- a/src/Pecee/SimpleRouter/Route/RouteResource.php +++ b/src/Pecee/SimpleRouter/Route/RouteResource.php @@ -7,22 +7,22 @@ use Pecee\Http\Request; class RouteResource extends LoadableRoute implements IControllerRoute { protected array $urls = [ - 'index' => '', - 'create' => 'create', - 'store' => '', - 'show' => '', - 'edit' => 'edit', - 'update' => '', + 'index' => '', + 'create' => 'create', + 'store' => '', + 'show' => '', + 'edit' => 'edit', + 'update' => '', 'destroy' => '', ]; protected array $methodNames = [ - 'index' => 'index', - 'create' => 'create', - 'store' => 'store', - 'show' => 'show', - 'edit' => 'edit', - 'update' => 'update', + 'index' => 'index', + 'create' => 'create', + 'store' => 'store', + 'show' => 'show', + 'edit' => 'edit', + 'update' => 'update', 'destroy' => 'destroy', ]; @@ -68,12 +68,15 @@ class RouteResource extends LoadableRoute implements IControllerRoute */ public function findUrl(?string $method = null, $parameters = null, ?string $name = null): string { - $url = array_search($name, $this->names, true); - if ($url !== false) { - return rtrim($this->url . $this->urls[$url], '/') . '/'; + $url = parent::findUrl($method, $parameters, $name); + + $action = array_search($name, $this->names, true); + + if ($action !== false) { + return $url . $this->urls[$action]; } - return $this->url; + return $url; } protected function call($method): bool @@ -172,12 +175,12 @@ class RouteResource extends LoadableRoute implements IControllerRoute $this->name = $name; $this->names = [ - 'index' => $this->name . '.index', - 'create' => $this->name . '.create', - 'store' => $this->name . '.store', - 'show' => $this->name . '.show', - 'edit' => $this->name . '.edit', - 'update' => $this->name . '.update', + 'index' => $this->name . '.index', + 'create' => $this->name . '.create', + 'store' => $this->name . '.store', + 'show' => $this->name . '.show', + 'edit' => $this->name . '.edit', + 'update' => $this->name . '.update', 'destroy' => $this->name . '.destroy', ]; diff --git a/tests/Pecee/SimpleRouter/RouterResourceTest.php b/tests/Pecee/SimpleRouter/RouterResourceTest.php index 0b6f5fb..a5040bd 100644 --- a/tests/Pecee/SimpleRouter/RouterResourceTest.php +++ b/tests/Pecee/SimpleRouter/RouterResourceTest.php @@ -66,4 +66,20 @@ class RouterResourceTest extends \PHPUnit\Framework\TestCase } + public function testResourceUrls() + { + TestRouter::resource('/resource', 'ResourceController')->name('resource'); + + TestRouter::debugOutputNoReset('/resource'); + + $this->assertEquals('/resource/3/create/', TestRouter::router()->getUrl('resource.create', ['id' => 3])); + $this->assertEquals('/resource/3/edit/', TestRouter::router()->getUrl('resource.edit', ['id' => 3])); + $this->assertEquals('/resource/3/', TestRouter::router()->getUrl('resource.update', ['id' => 3])); + $this->assertEquals('/resource/3/', TestRouter::router()->getUrl('resource.destroy', ['id' => 3])); + $this->assertEquals('/resource/3/', TestRouter::router()->getUrl('resource.delete', ['id' => 3])); + $this->assertEquals('/resource/', TestRouter::router()->getUrl('resource')); + + TestRouter::router()->reset(); + } + } \ No newline at end of file