Skip to content

Commit 1169dbc

Browse files
committed
add hook for missing named route resolution
1 parent 8bea688 commit 1169dbc

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

src/Illuminate/Routing/UrlGenerator.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,13 @@ class UrlGenerator implements UrlGeneratorContract
8989
*/
9090
protected $keyResolver;
9191

92+
/**
93+
* The missing named route resolver callable.
94+
*
95+
* @var callable
96+
*/
97+
protected $missingNamedRouteResolver;
98+
9299
/**
93100
* The callback to use to format hosts.
94101
*
@@ -464,6 +471,11 @@ public function route($name, $parameters = [], $absolute = true)
464471
return $this->toRoute($route, $parameters, $absolute);
465472
}
466473

474+
if (! is_null($this->missingNamedRouteResolver) &&
475+
! is_null($url = call_user_func($this->missingNamedRouteResolver, $name, $parameters, $absolute))) {
476+
return $url;
477+
}
478+
467479
throw new RouteNotFoundException("Route [{$name}] not defined.");
468480
}
469481

@@ -820,6 +832,19 @@ public function withKeyResolver(callable $keyResolver)
820832
return (clone $this)->setKeyResolver($keyResolver);
821833
}
822834

835+
/**
836+
* Set the callback that should be used to attempt to resolve missing named routes.
837+
*
838+
* @param callable $missingNamedRouteResolver
839+
* @return $this
840+
*/
841+
public function resolveMissingNamedRoutesUsing(callable $missingNamedRouteResolver)
842+
{
843+
$this->missingNamedRouteResolver = $missingNamedRouteResolver;
844+
845+
return $this;
846+
}
847+
823848
/**
824849
* Get the root controller namespace.
825850
*

tests/Routing/RoutingUrlGeneratorTest.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -908,6 +908,18 @@ public function testSignedUrlWithKeyResolver()
908908
$this->assertTrue($url2->hasValidSignature($request));
909909
$this->assertFalse($url->hasValidSignature($request));
910910
}
911+
912+
public function testMissingNamedRouteResolution()
913+
{
914+
$url = new UrlGenerator(
915+
new RouteCollection,
916+
Request::create('http://www.foo.com/')
917+
);
918+
919+
$url->resolveMissingNamedRoutesUsing(fn ($name, $parameters, $absolute) => 'test-url');
920+
921+
$this->assertSame('test-url', $url->route('foo'));
922+
}
911923
}
912924

913925
class RoutableInterfaceStub implements UrlRoutable

0 commit comments

Comments
 (0)