From 645232e53cb21af2a418adba0d3b6d5c84e8eb46 Mon Sep 17 00:00:00 2001 From: lukinovec Date: Mon, 19 May 2025 08:39:09 +0200 Subject: [PATCH] Allow cloning specific routes by name --- src/Actions/CloneRoutesAsTenant.php | 9 +++++++-- tests/CloneActionTest.php | 10 +++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/Actions/CloneRoutesAsTenant.php b/src/Actions/CloneRoutesAsTenant.php index 78add606..6256e680 100644 --- a/src/Actions/CloneRoutesAsTenant.php +++ b/src/Actions/CloneRoutesAsTenant.php @@ -32,7 +32,7 @@ use Stancl\Tenancy\Resolvers\PathTenantResolver; class CloneRoutesAsTenant { protected array $routesToClone = []; - protected Closure|null $cloneUsing = null; + protected Closure|null $cloneUsing = null; // The callback should accept Route instance or the route name (string) protected Closure|null $shouldBeCloned = null; protected array $cloneRoutesWithMiddleware = ['clone']; @@ -59,6 +59,11 @@ class CloneRoutesAsTenant continue; } + if (is_string($route)) { + $this->router->getRoutes()->refreshNameLookups(); + $route = $this->router->getRoutes()->getByName($route); + } + $this->copyMiscRouteProperties($route, $this->createNewRoute($route)); } @@ -86,7 +91,7 @@ class CloneRoutesAsTenant return $this; } - public function cloneRoute(Route $route): static + public function cloneRoute(Route|string $route): static { $this->routesToClone[] = $route; diff --git a/tests/CloneActionTest.php b/tests/CloneActionTest.php index 39d8f94f..ddd747b5 100644 --- a/tests/CloneActionTest.php +++ b/tests/CloneActionTest.php @@ -113,7 +113,7 @@ test('custom callbacks can be used for customizing the creation of the cloned ro pest()->get(route('cloned.bar'))->assertSee('cloned route'); }); -test('the clone action can clone specific routes', function() { +test('the clone action can clone specific routes', function(bool $cloneRouteByName) { RouteFacade::get('/foo', fn () => true)->name('foo'); $barRoute = RouteFacade::get('/bar', fn () => true)->name('bar'); RouteFacade::get('/baz', fn () => true)->name('baz'); @@ -124,13 +124,17 @@ test('the clone action can clone specific routes', function() { /** @var CloneRoutesAsTenant $cloneRoutesAction */ $cloneRoutesAction = app(CloneRoutesAsTenant::class); - $cloneRoutesAction->cloneRoute($barRoute)->handle(); + // A route instance or a route name can be passed to cloneRoute() + $cloneRoutesAction->cloneRoute($cloneRouteByName ? $barRoute->getName() : $barRoute)->handle(); // Exactly one route should be cloned expect($currentRouteCount())->toEqual($initialRouteCount + 1); expect(RouteFacade::getRoutes()->getByName('tenant.bar'))->not()->toBeNull(); -}); +})->with([ + true, + false, +]); test('the clone action prefixes already prefixed routes correctly', function () { $routes = [