Skip to content

Commit a3359f8

Browse files
Fix inherited custom route key name detection (#540)
* Add failing test for inherited custom route key name * Wip * Fix
1 parent be544f5 commit a3359f8

2 files changed

Lines changed: 34 additions & 2 deletions

File tree

src/Ziggy.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Tightenco\Ziggy;
44

55
use Illuminate\Contracts\Routing\UrlRoutable;
6+
use Illuminate\Database\Eloquent\Model;
67
use Illuminate\Support\Arr;
78
use Illuminate\Support\Reflector;
89
use Illuminate\Support\Str;
@@ -174,7 +175,7 @@ private function resolveBindings(array $routes): array
174175
? Reflector::getParameterClassName($parameter)
175176
: $parameter->getType()->getName();
176177
$override = (new ReflectionClass($model))->isInstantiable()
177-
&& $model === (new ReflectionMethod($model, 'getRouteKeyName'))->class;
178+
&& (new ReflectionMethod($model, 'getRouteKeyName'))->class !== Model::class;
178179

179180
// Avoid booting this model if it doesn't override the default route key name
180181
$bindings[$parameter->getName()] = $override ? app($model)->getRouteKeyName() : 'id';

tests/Unit/RouteModelBindingTest.php

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ protected function setUp(): void
1717
$router->get('users/{user}', function (User $user) {
1818
return '';
1919
})->name('users');
20+
$router->get('admins/{admin}', function (Admin $admin) {
21+
return '';
22+
})->name('admins');
2023
$router->get('tags/{tag}', function (Tag $tag) {
2124
return '';
2225
})->name('tags');
@@ -58,6 +61,22 @@ public function can_register_implicit_route_model_bindings()
5861
$this->assertSame($expected, (new Ziggy)->filter('users')->toArray()['routes']);
5962
}
6063

64+
/** @test */
65+
public function register_inherited_custom_route_key_name()
66+
{
67+
$expected = [
68+
'admins' => [
69+
'uri' => 'admins/{admin}',
70+
'methods' => ['GET', 'HEAD'],
71+
'bindings' => [
72+
'admin' => 'uuid',
73+
],
74+
],
75+
];
76+
77+
$this->assertSame($expected, (new Ziggy)->filter('admins')->toArray()['routes']);
78+
}
79+
6180
/** @test */
6281
public function can_ignore_route_parameters_not_bound_to_eloquent_models()
6382
{
@@ -139,6 +158,13 @@ public function can_merge_implicit_and_scoped_bindings()
139158
'user' => 'uuid',
140159
],
141160
],
161+
'admins' => [
162+
'uri' => 'admins/{admin}',
163+
'methods' => ['GET', 'HEAD'],
164+
'bindings' => [
165+
'admin' => 'uuid',
166+
],
167+
],
142168
'tags' => [
143169
'uri' => 'tags/{tag}',
144170
'methods' => ['GET', 'HEAD'],
@@ -188,7 +214,7 @@ public function can_include_bindings_in_json()
188214
$this->markTestSkipped('Requires Laravel >=7');
189215
}
190216

191-
$json = '{"url":"http:\/\/ziggy.dev","port":null,"defaults":{},"routes":{"users":{"uri":"users\/{user}","methods":["GET","HEAD"],"bindings":{"user":"uuid"}},"tags":{"uri":"tags\/{tag}","methods":["GET","HEAD"],"bindings":{"tag":"id"}},"tokens":{"uri":"tokens\/{token}","methods":["GET","HEAD"]},"users.numbers":{"uri":"users\/{user}\/{number}","methods":["GET","HEAD"],"bindings":{"user":"uuid"}},"users.store":{"uri":"users","methods":["POST"]},"posts":{"uri":"blog\/{category}\/{post}","methods":["GET","HEAD"],"bindings":{"category":"id","post":"slug"}},"posts.tags":{"uri":"blog\/{category}\/{post}\/{tag}","methods":["GET","HEAD"],"bindings":{"category":"id","post":"slug","tag":"slug"}}}}';
217+
$json = '{"url":"http:\/\/ziggy.dev","port":null,"defaults":{},"routes":{"users":{"uri":"users\/{user}","methods":["GET","HEAD"],"bindings":{"user":"uuid"}},"admins":{"uri":"admins\/{admin}","methods":["GET","HEAD"],"bindings":{"admin":"uuid"}},"tags":{"uri":"tags\/{tag}","methods":["GET","HEAD"],"bindings":{"tag":"id"}},"tokens":{"uri":"tokens\/{token}","methods":["GET","HEAD"]},"users.numbers":{"uri":"users\/{user}\/{number}","methods":["GET","HEAD"],"bindings":{"user":"uuid"}},"users.store":{"uri":"users","methods":["POST"]},"posts":{"uri":"blog\/{category}\/{post}","methods":["GET","HEAD"],"bindings":{"category":"id","post":"slug"}},"posts.tags":{"uri":"blog\/{category}\/{post}\/{tag}","methods":["GET","HEAD"],"bindings":{"category":"id","post":"slug","tag":"slug"}}}}';
192218

193219
$this->assertSame($json, (new Ziggy)->toJson());
194220
}
@@ -256,3 +282,8 @@ public static function boot()
256282
static::$wasBooted = true;
257283
}
258284
}
285+
286+
class Admin extends User
287+
{
288+
//
289+
}

0 commit comments

Comments
 (0)