Skip to content

Commit 686c16c

Browse files
authored
feat: add the ability to create API routes with multiple route parameters
Merge pull request #271 from jonerickson/feature/multiple-controller-arguments
2 parents 306fbff + 3fa175c commit 686c16c

File tree

43 files changed

+915
-89
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+915
-89
lines changed

src/Concerns/HandlesRelationManyToManyOperations.php

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@ trait HandlesRelationManyToManyOperations
1717
* Attach resource to the relation in a transaction-safe way.
1818
*
1919
* @param Request $request
20-
* @param int|string $parentKey
20+
* @param array<int, mixed>$args
2121
* @return JsonResponse
2222
*/
23-
public function attach(Request $request, $parentKey)
23+
public function attach(Request $request, ...$args)
2424
{
25+
$parentKey = $this->keyResolver->resolveRelationOperationParentKey($request, $args);
26+
2527
try {
2628
$this->startTransaction();
2729
$result = $this->attachWithTransaction($request, $parentKey);
@@ -237,11 +239,13 @@ protected function afterAttach(Request $request, Model $parentEntity, array &$at
237239
* Detach resource to the relation in a transaction-safe way.
238240
*
239241
* @param Request $request
240-
* @param int|string $parentKey
242+
* @param array<int, mixed> $args
241243
* @return JsonResponse
242244
*/
243-
public function detach(Request $request, $parentKey)
245+
public function detach(Request $request, ...$args)
244246
{
247+
$parentKey = $this->keyResolver->resolveRelationOperationParentKey($request, $args);
248+
245249
try {
246250
$this->startTransaction();
247251
$result = $this->detachWithTransaction($request, $parentKey);
@@ -360,11 +364,13 @@ protected function afterDetach(Request $request, Model $parentEntity, array &$de
360364
* Sync relation resources in a transaction-safe way.
361365
*
362366
* @param Request $request
363-
* @param int|string $parentKey
367+
* @param array<int, mixed> $args
364368
* @return JsonResponse
365369
*/
366-
public function sync(Request $request, $parentKey)
370+
public function sync(Request $request, ...$args)
367371
{
372+
$parentKey = $this->keyResolver->resolveRelationOperationParentKey($request, $args);
373+
368374
try {
369375
$this->startTransaction();
370376
$result = $this->syncWithTransaction($request, $parentKey);
@@ -486,11 +492,13 @@ protected function afterSync(Request $request, Model $parentEntity, array &$sync
486492
* Toggle relation resources in a transaction-safe way.
487493
*
488494
* @param Request $request
489-
* @param int|string $parentKey
495+
* @param array<int, mixed> $args
490496
* @return JsonResponse
491497
*/
492-
public function toggle(Request $request, $parentKey)
498+
public function toggle(Request $request, ...$args)
493499
{
500+
$parentKey = $this->keyResolver->resolveRelationOperationParentKey($request, $args);
501+
494502
try {
495503
$this->startTransaction();
496504
$result = $this->toggleWithTransaction($request, $parentKey);
@@ -603,12 +611,14 @@ protected function afterToggle(Request $request, Model $parentEntity, array &$to
603611
* Update relation resource pivot in a transaction-safe wqy.
604612
*
605613
* @param Request $request
606-
* @param int|string $parentKey
607-
* @param int|string $relatedKey
614+
* @param array<int, mixed> $args
608615
* @return JsonResponse
609616
*/
610-
public function updatePivot(Request $request, $parentKey, $relatedKey)
617+
public function updatePivot(Request $request, ...$args)
611618
{
619+
$parentKey = $this->keyResolver->resolveRelationOperationParentKey($request, $args);
620+
$relatedKey = $this->keyResolver->resolveRelationOperationRelatedKey($request, $args);
621+
612622
try {
613623
$this->startTransaction();
614624
$result = $this->updatePivotWithTransaction($request, $parentKey, $relatedKey);

src/Concerns/HandlesRelationOneToManyOperations.php

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ trait HandlesRelationOneToManyOperations
1414
* Associates resource with another resource in a transaction-safe way.
1515
*
1616
* @param Request $request
17-
* @param int|string $parentKey
17+
* @param array<int, mixed> $args
1818
* @return Resource
1919
*/
20-
public function associate(Request $request, $parentKey)
20+
public function associate(Request $request, ...$args)
2121
{
22+
$parentKey = $this->keyResolver->resolveRelationOperationParentKey($request, $args);
23+
2224
try {
2325
$this->startTransaction();
2426
$result = $this->associateWithTransaction($request, $parentKey);
@@ -164,12 +166,14 @@ protected function afterAssociate(Request $request, Model $parentEntity, Model $
164166
* Disassociates resource from another resource in a transaction-safe way.
165167
*
166168
* @param Request $request
167-
* @param int|string $parentKey
168-
* @param int|string $relatedKey
169+
* @param array<int, mixed> $args
169170
* @return Resource
170171
*/
171-
public function dissociate(Request $request, $parentKey, $relatedKey)
172+
public function dissociate(Request $request, ...$args)
172173
{
174+
$parentKey = $this->keyResolver->resolveRelationOperationParentKey($request, $args);
175+
$relatedKey = $this->keyResolver->resolveRelationOperationRelatedKey($request, $args);
176+
173177
try {
174178
$this->startTransaction();
175179
$result = $this->dissociateWithTransaction($request, $parentKey, $relatedKey);

src/Concerns/HandlesRelationStandardBatchOperations.php

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@ trait HandlesRelationStandardBatchOperations
1717
* Create a batch of new relation resources in a transaction-safe way.
1818
*
1919
* @param Request $request
20-
* @param int|string $parentKey
20+
* @param array<int, mixed> $args
2121
* @return CollectionResource
2222
*/
23-
public function batchStore(Request $request, $parentKey)
23+
public function batchStore(Request $request, ...$args)
2424
{
25+
$parentKey = $this->keyResolver->resolveRelationOperationParentKey($request, $args);
26+
2527
try {
2628
$this->startTransaction();
2729
$result = $this->batchStoreWithTransaction($request, $parentKey);
@@ -161,11 +163,13 @@ protected function afterBatchStore(Request $request, Model $parentEntity, Collec
161163
* Updates a batch of relation resources in a transaction-safe way.
162164
*
163165
* @param Request $request
164-
* @param int|string $parentKey
166+
* @param array<int, mixed> $args
165167
* @return CollectionResource
166168
*/
167-
public function batchUpdate(Request $request, $parentKey)
169+
public function batchUpdate(Request $request, ...$args)
168170
{
171+
$parentKey = $this->keyResolver->resolveRelationOperationParentKey($request, $args);
172+
169173
try {
170174
$this->startTransaction();
171175
$result = $this->batchUpdateWithTransaction($request, $parentKey);
@@ -355,12 +359,14 @@ protected function afterBatchUpdate(Request $request, Model $parentEntity, Colle
355359
* Deletes a batch of relation resources in a transaction-safe way.
356360
*
357361
* @param Request $request
358-
* @param int|string $parentKey
362+
* @param array<int, mixed> $args
359363
* @return CollectionResource
360364
* @throws Exception
361365
*/
362-
public function batchDestroy(Request $request, $parentKey)
366+
public function batchDestroy(Request $request, ...$args)
363367
{
368+
$parentKey = $this->keyResolver->resolveRelationOperationParentKey($request, $args);
369+
364370
try {
365371
$this->startTransaction();
366372
$result = $this->batchDestroyWithTransaction($request, $parentKey);
@@ -527,12 +533,14 @@ protected function afterBatchDestroy(Request $request, Model $parentEntity, Coll
527533
* Restores a batch of relation resources in a transaction-safe way.
528534
*
529535
* @param Request $request
530-
* @param int|string $parentKey
536+
* @param array<int, mixed> $args
531537
* @return CollectionResource
532538
* @throws Exception
533539
*/
534-
public function batchRestore(Request $request, $parentKey)
540+
public function batchRestore(Request $request, ...$args)
535541
{
542+
$parentKey = $this->keyResolver->resolveRelationOperationParentKey($request, $args);
543+
536544
try {
537545
$this->startTransaction();
538546
$result = $this->batchRestoreWithTransaction($request, $parentKey);

src/Concerns/HandlesRelationStandardOperations.php

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,15 @@ trait HandlesRelationStandardOperations
2727
* Fetch the list of relation resources.
2828
*
2929
* @param Request $request
30-
* @param int|string $parentKey
30+
* @param array<int, mixed> $args
3131
* @return CollectionResource
3232
*/
33-
public function index(Request $request, $parentKey)
33+
public function index(Request $request, ...$args)
3434
{
3535
$requestedRelations = $this->relationsResolver->requestedRelations($request);
3636

37+
$parentKey = $this->keyResolver->resolveRelationOperationParentKey($request, $args);
38+
3739
$parentQuery = $this->buildIndexParentFetchQuery($request, $parentKey);
3840
$parentEntity = $this->runIndexParentFetchQuery($request, $parentQuery, $parentKey);
3941

@@ -255,11 +257,13 @@ public function search(Request $request, $parentKey)
255257
* Create new relation resource.
256258
*
257259
* @param Request $request
258-
* @param int|string $parentKey
260+
* @param array<int, mixed> $args
259261
* @return Resource
260262
*/
261-
public function store(Request $request, $parentKey)
263+
public function store(Request $request, ...$args)
262264
{
265+
$parentKey = $this->keyResolver->resolveRelationOperationParentKey($request, $args);
266+
263267
try {
264268
$this->startTransaction();
265269
$result = $this->storeWithTransaction($request, $parentKey);
@@ -484,12 +488,14 @@ protected function afterStore(Request $request, Model $parentEntity, Model $enti
484488
* Fetch a relation resource.
485489
*
486490
* @param Request $request
487-
* @param int|string $parentKey
488-
* @param int|string|null $relatedKey
491+
* @param array<int, mixed> $args
489492
* @return Resource
490493
*/
491-
public function show(Request $request, $parentKey, $relatedKey = null)
494+
public function show(Request $request, ...$args)
492495
{
496+
$parentKey = $this->keyResolver->resolveRelationOperationParentKey($request, $args);
497+
$relatedKey = $this->keyResolver->resolveRelationOperationRelatedKey($request, $args);
498+
493499
$parentQuery = $this->buildShowParentFetchQuery($request, $parentKey);
494500
$parentEntity = $this->runShowParentFetchQuery($request, $parentQuery, $parentKey);
495501

@@ -672,12 +678,15 @@ protected function afterShow(Request $request, Model $parentEntity, Model $entit
672678
* Update a relation resource in a transaction-safe way.
673679
*
674680
* @param Request $request
675-
* @param int|string $parentKey
681+
* @param array<int, mixed> $args
676682
* @param int|string|null $relatedKey
677683
* @return Resource
678684
*/
679-
public function update(Request $request, $parentKey, $relatedKey = null)
685+
public function update(Request $request, ...$args)
680686
{
687+
$parentKey = $this->keyResolver->resolveRelationOperationParentKey($request, $args);
688+
$relatedKey = $this->keyResolver->resolveRelationOperationRelatedKey($request, $args);
689+
681690
try {
682691
$this->startTransaction();
683692
$result = $this->updateWithTransaction($request, $parentKey, $relatedKey);
@@ -889,13 +898,16 @@ protected function afterUpdate(Request $request, Model $parentEntity, Model $ent
889898
* Delete a relation resource.
890899
*
891900
* @param Request $request
892-
* @param int|string $parentKey
901+
* @param array<int, mixed> $args
893902
* @param int|string|null $relatedKey
894903
* @return Resource
895904
* @throws Exception
896905
*/
897-
public function destroy(Request $request, $parentKey, $relatedKey = null)
906+
public function destroy(Request $request, ...$args)
898907
{
908+
$parentKey = $this->keyResolver->resolveRelationOperationParentKey($request, $args);
909+
$relatedKey = $this->keyResolver->resolveRelationOperationRelatedKey($request, $args);
910+
899911
try {
900912
$this->startTransaction();
901913
$result = $this->destroyWithTransaction($request, $parentKey, $relatedKey);
@@ -1079,12 +1091,15 @@ protected function afterDestroy(Request $request, Model $parentEntity, Model $en
10791091
* Restores a previously deleted relation resource in a transaction-save way.
10801092
*
10811093
* @param Request $request
1082-
* @param int|string $parentKey
1094+
* @param array<int, mixed> $args
10831095
* @param int|string|null $relatedKey
10841096
* @return Resource
10851097
*/
1086-
public function restore(Request $request, $parentKey, $relatedKey = null)
1098+
public function restore(Request $request, ...$args)
10871099
{
1100+
$parentKey = $this->keyResolver->resolveRelationOperationParentKey($request, $args);
1101+
$relatedKey = $this->keyResolver->resolveRelationOperationRelatedKey($request, $args);
1102+
10881103
try {
10891104
$this->startTransaction();
10901105
$result = $this->restoreWithTransaction($request, $parentKey, $relatedKey);

src/Concerns/HandlesStandardOperations.php

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -329,17 +329,19 @@ protected function afterStore(Request $request, Model $entity)
329329
* Fetches resource.
330330
*
331331
* @param Request $request
332-
* @param int|string $key
332+
* @param array<int, mixed> $args
333333
* @return Resource
334334
* @throws AuthorizationException
335335
* @throws BindingResolutionException
336336
*/
337-
public function show(Request $request, $key)
337+
public function show(Request $request, ...$args)
338338
{
339339
$requestedRelations = $this->relationsResolver->requestedRelations($request);
340340

341341
$query = $this->buildShowFetchQuery($request, $requestedRelations);
342342

343+
$key = $this->keyResolver->resolveStandardOperationKey($request, $args);
344+
343345
$beforeHookResult = $this->beforeShow($request, $key);
344346
if ($this->hookResponds($beforeHookResult)) {
345347
return $beforeHookResult;
@@ -438,11 +440,13 @@ protected function afterShow(Request $request, Model $entity)
438440
* Update a resource in a transaction-safe way.
439441
*
440442
* @param Request $request
441-
* @param int|string $key
443+
* @param array<int, mixed> $args
442444
* @return Resource
443445
*/
444-
public function update(Request $request, $key)
446+
public function update(Request $request, ...$args)
445447
{
448+
$key = $this->keyResolver->resolveStandardOperationKey($request, $args);
449+
446450
try {
447451
$this->startTransaction();
448452
$result = $this->updateWithTransaction($request, $key);
@@ -602,12 +606,14 @@ protected function afterUpdate(Request $request, Model $entity)
602606
* Deletes a resource.
603607
*
604608
* @param Request $request
605-
* @param int|string $key
609+
* @param array<int, mixed> $args
606610
* @return Resource
607611
* @throws Exception
608612
*/
609-
public function destroy(Request $request, $key)
613+
public function destroy(Request $request, ...$args)
610614
{
615+
$key = $this->keyResolver->resolveStandardOperationKey($request, $args);
616+
611617
try {
612618
$this->startTransaction();
613619
$result = $this->destroyWithTransaction($request, $key);
@@ -767,12 +773,14 @@ protected function afterDestroy(Request $request, Model $entity)
767773
* Restore previously deleted resource in a transaction-safe way.
768774
*
769775
* @param Request $request
770-
* @param int|string $key
776+
* @param array<int, mixed> $args
771777
* @return Resource
772778
* @throws Exception
773779
*/
774-
public function restore(Request $request, $key)
780+
public function restore(Request $request, ...$args)
775781
{
782+
$key = $this->keyResolver->resolveStandardOperationKey($request, $args);
783+
776784
try {
777785
$this->startTransaction();
778786
$result = $this->restoreWithTransaction($request, $key);

src/Contracts/KeyResolver.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Orion\Contracts;
4+
5+
use Illuminate\Http\Request;
6+
7+
interface KeyResolver
8+
{
9+
public function resolveStandardOperationKey(Request $request, array $args);
10+
11+
public function resolveRelationOperationParentKey(Request $request, array $args);
12+
13+
public function resolveRelationOperationRelatedKey(Request $request, array $args);
14+
}

src/Drivers/Standard/KeyResolver.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace Orion\Drivers\Standard;
4+
5+
use Illuminate\Http\Request;
6+
7+
class KeyResolver implements \Orion\Contracts\KeyResolver
8+
{
9+
public function resolveStandardOperationKey(Request $request, array $args)
10+
{
11+
return $args[0];
12+
}
13+
14+
public function resolveRelationOperationParentKey(Request $request, array $args)
15+
{
16+
return $args[0];
17+
}
18+
19+
public function resolveRelationOperationRelatedKey(Request $request, array $args)
20+
{
21+
return $args[1] ?? null;
22+
}
23+
}

0 commit comments

Comments
 (0)