Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
freekmurze committed Jan 9, 2022
1 parent b352b21 commit edc7a90
Show file tree
Hide file tree
Showing 7 changed files with 101 additions and 0 deletions.
1 change: 1 addition & 0 deletions config/route-discovery.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,6 @@
Spatie\RouteDiscovery\PendingRouteTransformers\HandleWheresAttribute::class,
Spatie\RouteDiscovery\PendingRouteTransformers\AddDefaultRouteName::class,
Spatie\RouteDiscovery\PendingRouteTransformers\HandleDomainAttribute::class,
Spatie\RouteDiscovery\PendingRouteTransformers\MoveRoutesStartingWithParametersLast::class,
],
];
5 changes: 5 additions & 0 deletions src/PendingRouteTransformers/HandleWheresAttribute.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@

class HandleWheresAttribute implements PendingRouteTransformer
{
/**
* @param Collection<PendingRoute> $pendingRoutes
*
* @return Collection<PendingRoute>
*/
public function transform(Collection $pendingRoutes): Collection
{
$pendingRoutes->each(function (PendingRoute $pendingRoute) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

namespace Spatie\RouteDiscovery\PendingRouteTransformers;

use Illuminate\Support\Collection;
use Spatie\RouteDiscovery\PendingRoutes\PendingRoute;
use Spatie\RouteDiscovery\PendingRoutes\PendingRouteAction;

class MoveRoutesStartingWithParametersLast implements PendingRouteTransformer
{
/**
* @param Collection<PendingRoute> $pendingRoutes
*
* @return Collection<PendingRoute>
*/
public function transform(Collection $pendingRoutes): Collection
{
return $pendingRoutes->sortBy(function(PendingRoute $pendingRoute) {
$containsRouteStartingWithUri = $pendingRoute->actions->contains(function(PendingRouteAction $action) {
return str_starts_with($action->uri, '{');
});

if (! $containsRouteStartingWithUri) {
return 0;
}

return $pendingRoute->actions->max(function(PendingRouteAction $action) {
if (! str_starts_with($action->uri, '{')) {
return PHP_INT_MAX;
}

return PHP_INT_MAX - count(explode('/', $action->uri));
});
})
->values();
}
}
19 changes: 19 additions & 0 deletions tests/RouteDiscoveryTest.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<?php

use Illuminate\Routing\Route;
use Spatie\RouteDiscovery\Attributes\WhereUuid;
use Spatie\RouteDiscovery\Tests\Support\TestClasses\Controllers\CustomRouteName\CustomRouteNameController;
use Spatie\RouteDiscovery\Tests\Support\TestClasses\Controllers\DefaultRouteName\DefaultRouteNameController;
Expand Down Expand Up @@ -379,3 +380,21 @@
controllerMethod: '__invoke',
);
});

it('will make sure the routes whose uri start with parameters will be registered last', function() {
$this
->routeRegistrar
->registerDirectory(controllersPath('RouteOrder'));

$this->assertRegisteredRoutesCount(3);

$registeredUris = collect(app()->router->getRoutes())
->map(fn(Route $route) => $route->uri)
->toArray();

expect($registeredUris)->toEqual([
'z-z-z',
'{parameter}/extra',
'{parameter}',
]);
});
14 changes: 14 additions & 0 deletions tests/Support/TestClasses/Controllers/RouteOrder/AAAController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Spatie\RouteDiscovery\Tests\Support\TestClasses\Controllers\RouteOrder;

use Spatie\RouteDiscovery\Attributes\Route;

class AAAController
{
#[Route(fullUri: '{parameter}')]
public function invoke()
{

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Spatie\RouteDiscovery\Tests\Support\TestClasses\Controllers\RouteOrder;

use Spatie\RouteDiscovery\Attributes\Route;

class MiddleController
{
#[Route(fullUri: '{parameter}/extra')]
public function invoke()
{

}
}
11 changes: 11 additions & 0 deletions tests/Support/TestClasses/Controllers/RouteOrder/ZZZController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace Spatie\RouteDiscovery\Tests\Support\TestClasses\Controllers\RouteOrder;

class ZZZController
{
public function __invoke()
{

}
}

0 comments on commit edc7a90

Please sign in to comment.