Skip to content

Commit

Permalink
Fix bug in normalizing URL
Browse files Browse the repository at this point in the history
  • Loading branch information
shalvah committed Nov 8, 2022
1 parent fe70df9 commit d0e7e3a
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 4 deletions.
12 changes: 8 additions & 4 deletions src/Extracting/Shared/UrlParamsNormalizer.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public static function normalizeParameterNamesInRouteUri(Route $route, Reflectio
$uri = $route->uri;
preg_match_all('#\{(\w+?)}#', $uri, $params);

$resourceRouteNames = [".index", ".show", ".update", ".destroy"];
$resourceRouteNames = [".index", ".show", ".update", ".destroy", ".store"];

$typeHintedEloquentModels = self::getTypeHintedEloquentModels($method);
$routeName = $route->action['as'] ?? '';
Expand All @@ -42,7 +42,11 @@ public static function normalizeParameterNamesInRouteUri(Route $route, Reflectio
$alreadyFoundResourceParam = false;
foreach (array_reverse($pluralResources) as $pluralResource) {
$singularResource = Str::singular($pluralResource);
$singularResourceParam = str_replace('-', '_', $singularResource); // URL parameters are often declared with _ in Laravel but - outside

// Laravel turns hyphens in parameters to underscores
// (`cool-things/{cool-thing}` to `cool-things/{cool_thing_id}`)
// so we do the same
$singularResourceParam = str_replace('-', '_', $singularResource);

$urlPatternsToSearchFor = [
"{$pluralResource}/{{$singularResourceParam}}",
Expand All @@ -63,10 +67,10 @@ public static function normalizeParameterNamesInRouteUri(Route $route, Reflectio
} else {
// Other resource parameters will be `params/{<param>_id}`
$replaceWith = [
"{$pluralResource}/{{$singularResource}_{$binding}}",
"{$pluralResource}/{{$singularResourceParam}_{$binding}}",
"{$pluralResource}/{{$singularResource}_{$binding}?}",
"{$pluralResource}/{{$singularResource}_{$binding}}",
"{$pluralResource}/{{$singularResourceParam}_{$binding}?}",
"{$pluralResource}/{{$singularResource}_{$binding}?}",
];
}
$uri = str_replace($urlPatternsToSearchFor, $replaceWith, $uri);
Expand Down
6 changes: 6 additions & 0 deletions tests/Unit/ExtractedEndpointDataTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,12 @@ public function normalizes_resource_url_params_from_underscores_to_hyphens()

$this->assertEquals('audio-things/{audio_thing}', $this->originalUri($route));
$this->assertEquals('audio-things/{id}', $this->expectedUri($route));

Route::apiResource('big-users.audio-things.things', TestController::class)->only('store');
$route = $this->getRoute(['prefixes' => '*big-users*']);

$this->assertEquals('big-users/{big_user}/audio-things/{audio_thing}/things', $this->originalUri($route));
$this->assertEquals('big-users/{big_user_id}/audio-things/{audio_thing_id}/things', $this->expectedUri($route));
}

/** @test */
Expand Down

0 comments on commit d0e7e3a

Please sign in to comment.