|
1 | 1 | <?php |
2 | 2 |
|
| 3 | +use Illuminate\Database\Eloquent\Attributes\RouteKey; |
| 4 | +use Illuminate\Database\Eloquent\Attributes\Table; |
3 | 5 | use Illuminate\Database\Eloquent\Model; |
4 | 6 | use Illuminate\Support\Facades\Route; |
5 | 7 | use Tighten\Ziggy\Ziggy; |
| 8 | +use function Orchestra\Testbench\laravel_version_compare; |
6 | 9 |
|
7 | 10 | beforeEach(function () { |
8 | 11 | Route::get('users/{user}', fn (User $user) => '')->name('users'); |
|
13 | 16 | Route::post('users', fn (User $user) => '')->name('users.store'); |
14 | 17 | Route::get('comments/{comment}', fn (Comment $comment) => '')->name('comments'); |
15 | 18 | Route::get('replies/{reply}', fn (Reply $reply) => '')->name('replies'); |
| 19 | + Route::get('replies-table/{reply}', fn (ReplyWithTable $reply) => '')->name('replies-table'); |
| 20 | + Route::get('replies-route-key/{reply}', fn (ReplyWithRouteKey $reply) => '')->name('replies-route-key'); |
16 | 21 | Route::get('blog/{category}/{post:slug}', fn (PostCategory $category, Post $post) => '')->name('posts'); |
17 | 22 | Route::get('blog/{category}/{post:slug}/{tag:slug}', fn (PostCategory $category, Post $post, Tag $tag) => '')->name('posts.tags'); |
18 | 23 | }); |
|
140 | 145 | 'reply' => 'uuid', |
141 | 146 | ], |
142 | 147 | ], |
| 148 | + 'replies-table' => [ |
| 149 | + 'uri' => 'replies-table/{reply}', |
| 150 | + 'methods' => ['GET', 'HEAD'], |
| 151 | + 'parameters' => ['reply'], |
| 152 | + 'bindings' => [ |
| 153 | + 'reply' => laravel_version_compare('13.0', '>=') ? 'uuid' : 'id', |
| 154 | + ], |
| 155 | + ], |
| 156 | + 'replies-route-key' => [ |
| 157 | + 'uri' => 'replies-route-key/{reply}', |
| 158 | + 'methods' => ['GET', 'HEAD'], |
| 159 | + 'parameters' => ['reply'], |
| 160 | + 'bindings' => [ |
| 161 | + 'reply' => laravel_version_compare('13.0', '>=') ? 'uuid' : 'id', |
| 162 | + ], |
| 163 | + ], |
143 | 164 | 'posts' => [ |
144 | 165 | 'uri' => 'blog/{category}/{post}', |
145 | 166 | 'methods' => ['GET', 'HEAD'], |
|
164 | 185 |
|
165 | 186 | test('include bindings in json', function () { |
166 | 187 | expect((new Ziggy)->toJson()) |
167 | | - ->toBe('{"url":"http:\/\/ziggy.dev","port":null,"defaults":{},"routes":{"users":{"uri":"users\/{user}","methods":["GET","HEAD"],"parameters":["user"],"bindings":{"user":"uuid"}},"admins":{"uri":"admins\/{admin}","methods":["GET","HEAD"],"parameters":["admin"],"bindings":{"admin":"uuid"}},"tags":{"uri":"tags\/{tag}","methods":["GET","HEAD"],"parameters":["tag"],"bindings":{"tag":"id"}},"tokens":{"uri":"tokens\/{token}","methods":["GET","HEAD"],"parameters":["token"]},"users.numbers":{"uri":"users\/{user}\/{number}","methods":["GET","HEAD"],"parameters":["user","number"],"bindings":{"user":"uuid"}},"users.store":{"uri":"users","methods":["POST"]},"comments":{"uri":"comments\/{comment}","methods":["GET","HEAD"],"parameters":["comment"],"bindings":{"comment":"uuid"}},"replies":{"uri":"replies\/{reply}","methods":["GET","HEAD"],"parameters":["reply"],"bindings":{"reply":"uuid"}},"posts":{"uri":"blog\/{category}\/{post}","methods":["GET","HEAD"],"parameters":["category","post"],"bindings":{"category":"id","post":"slug"}},"posts.tags":{"uri":"blog\/{category}\/{post}\/{tag}","methods":["GET","HEAD"],"parameters":["category","post","tag"],"bindings":{"category":"id","post":"slug","tag":"slug"}}}}'); |
168 | | -}); |
| 188 | + ->toBe('{"url":"http:\/\/ziggy.dev","port":null,"defaults":{},"routes":{"users":{"uri":"users\/{user}","methods":["GET","HEAD"],"parameters":["user"],"bindings":{"user":"uuid"}},"admins":{"uri":"admins\/{admin}","methods":["GET","HEAD"],"parameters":["admin"],"bindings":{"admin":"uuid"}},"tags":{"uri":"tags\/{tag}","methods":["GET","HEAD"],"parameters":["tag"],"bindings":{"tag":"id"}},"tokens":{"uri":"tokens\/{token}","methods":["GET","HEAD"],"parameters":["token"]},"users.numbers":{"uri":"users\/{user}\/{number}","methods":["GET","HEAD"],"parameters":["user","number"],"bindings":{"user":"uuid"}},"users.store":{"uri":"users","methods":["POST"]},"comments":{"uri":"comments\/{comment}","methods":["GET","HEAD"],"parameters":["comment"],"bindings":{"comment":"uuid"}},"replies":{"uri":"replies\/{reply}","methods":["GET","HEAD"],"parameters":["reply"],"bindings":{"reply":"uuid"}},"replies-table":{"uri":"replies-table\/{reply}","methods":["GET","HEAD"],"parameters":["reply"],"bindings":{"reply":"id"}},"replies-route-key":{"uri":"replies-route-key\/{reply}","methods":["GET","HEAD"],"parameters":["reply"],"bindings":{"reply":"id"}},"posts":{"uri":"blog\/{category}\/{post}","methods":["GET","HEAD"],"parameters":["category","post"],"bindings":{"category":"id","post":"slug"}},"posts.tags":{"uri":"blog\/{category}\/{post}\/{tag}","methods":["GET","HEAD"],"parameters":["category","post","tag"],"bindings":{"category":"id","post":"slug","tag":"slug"}}}}'); |
| 189 | +})->skip(fn () => laravel_version_compare('13.0', '>=')); |
| 190 | + |
| 191 | +test('include bindings from model attributes in json', function () { |
| 192 | + expect((new Ziggy)->toJson()) |
| 193 | + ->toBe('{"url":"http:\/\/ziggy.dev","port":null,"defaults":{},"routes":{"users":{"uri":"users\/{user}","methods":["GET","HEAD"],"parameters":["user"],"bindings":{"user":"uuid"}},"admins":{"uri":"admins\/{admin}","methods":["GET","HEAD"],"parameters":["admin"],"bindings":{"admin":"uuid"}},"tags":{"uri":"tags\/{tag}","methods":["GET","HEAD"],"parameters":["tag"],"bindings":{"tag":"id"}},"tokens":{"uri":"tokens\/{token}","methods":["GET","HEAD"],"parameters":["token"]},"users.numbers":{"uri":"users\/{user}\/{number}","methods":["GET","HEAD"],"parameters":["user","number"],"bindings":{"user":"uuid"}},"users.store":{"uri":"users","methods":["POST"]},"comments":{"uri":"comments\/{comment}","methods":["GET","HEAD"],"parameters":["comment"],"bindings":{"comment":"uuid"}},"replies":{"uri":"replies\/{reply}","methods":["GET","HEAD"],"parameters":["reply"],"bindings":{"reply":"uuid"}},"replies-table":{"uri":"replies-table\/{reply}","methods":["GET","HEAD"],"parameters":["reply"],"bindings":{"reply":"uuid"}},"replies-route-key":{"uri":"replies-route-key\/{reply}","methods":["GET","HEAD"],"parameters":["reply"],"bindings":{"reply":"uuid"}},"posts":{"uri":"blog\/{category}\/{post}","methods":["GET","HEAD"],"parameters":["category","post"],"bindings":{"category":"id","post":"slug"}},"posts.tags":{"uri":"blog\/{category}\/{post}\/{tag}","methods":["GET","HEAD"],"parameters":["category","post","tag"],"bindings":{"category":"id","post":"slug","tag":"slug"}}}}'); |
| 194 | +})->skip(fn () => laravel_version_compare('13.0', '<')); |
169 | 195 |
|
170 | 196 | test('skip booting models that dont override their route key', function () { |
171 | 197 | (new Ziggy)->filter(['tokens', 'users.numbers']); |
172 | 198 |
|
173 | 199 | expect(User::$wasBooted)->toBeTrue(); |
| 200 | + expect(ReplyWithTable::$wasBooted)->toBeTrue(); |
| 201 | + expect(ReplyWithRouteKey::$wasBooted)->toBeTrue(); |
174 | 202 | expect(Tag::$wasBooted)->toBeFalse(); |
175 | 203 | }); |
176 | 204 |
|
@@ -263,3 +291,27 @@ public function getKeyName() |
263 | 291 | return 'uuid'; |
264 | 292 | } |
265 | 293 | } |
| 294 | + |
| 295 | +#[Table(key: 'uuid')] |
| 296 | +class ReplyWithTable extends Model |
| 297 | +{ |
| 298 | + public static $wasBooted = false; |
| 299 | + |
| 300 | + public static function boot() |
| 301 | + { |
| 302 | + parent::boot(); |
| 303 | + static::$wasBooted = true; |
| 304 | + } |
| 305 | +} |
| 306 | + |
| 307 | +#[RouteKey(key: 'uuid')] |
| 308 | +class ReplyWithRouteKey extends Model |
| 309 | +{ |
| 310 | + public static $wasBooted = false; |
| 311 | + |
| 312 | + public static function boot() |
| 313 | + { |
| 314 | + parent::boot(); |
| 315 | + static::$wasBooted = true; |
| 316 | + } |
| 317 | +} |
0 commit comments