在Laravel中,我们可以通过以下方式从当前URL获取路线名称:
Route::currentRouteName()
但是,我们如何从特定的给定URL获取路由名称?
谢谢。
答案 0 :(得分:25)
一种非常简单的方法 Laravel 5.2
app('router')->getRoutes()->match(app('request')->create('/qqq/posts/68/u1'))->getName()
它输出我的路线名称,如 slug.posts.show
更新:对于 POST , PUT 或 DELETE 等方法,您可以这样做
app('router')->getRoutes()->match(app('request')->create('/qqq/posts/68/u1', 'POST'))->getName()//reference https://github.com/symfony/http-foundation/blob/master/Request.php#L309
此外,当您运行app('router')->getRoutes()->match(app('request')->create('/qqq/posts/68/u1', 'POST'))
时,会返回Illuminate\Routing\Route
个实例,您可以在其中调用多个有用的公共方法,例如getAction
,getValidators
等。检查来源{{3}有关详细信息。
答案 1 :(得分:3)
我不认为这可以通过开箱即用的Laravel来完成。还要记住,并非Laravel中的所有路由都已命名,因此您可能希望检索路由对象,而不是路由名称。
一种可能的解决方案是扩展默认的\Iluminate\Routing\Router
类,并向使用受保护的Router::findRoute(Request $request)
方法的自定义类添加公共方法。
简化示例:
class MyRouter extends \Illuminate\Routing\Router {
public function resolveRouteFromUrl($url) {
return $this->findRoute(\Illuminate\Http\Request::create($url));
}
}
此应返回与您指定的网址相匹配的路线,但我实际上并没有对此进行测试。
请注意,如果您希望这个新的自定义路由器替换内置路由器,您可能还需要创建一个新的ServiceProvider来将您的新类注册到IoC容器而不是默认容器。
您可以根据需要调整以下代码中的ServiceProvider:
https://github.com/jasonlewis/enhanced-router
否则,如果您只是想根据需要在代码中手动实例化自定义路由器,则必须执行以下操作:
$myRouter = new MyRouter(new \Illuminate\Events\Dispatcher());
$route = $myRouter->resolveRouteFromUrl('/your/url/here');
答案 2 :(得分:3)
可以在不扩展默认\Iluminate\Routing\Router
类的情况下完成。
Route::dispatchToRoute(Request::create('/your/url/here'));
$route = Route::currentRouteName();
如果在Route::currentRouteName()
呼叫后致电dispatchToRoute
,它将返回已分派请求的当前路由名称。
答案 3 :(得分:2)
以上所有解决方案都不适合我。
这是将路由与URI匹配的正确方法:
$url = 'url-to-match/some-parameter';
$route = collect(\Route::getRoutes())->first(function($route) use($url){
return $route->matches(request()->create($url));
});
其他解决方案执行到容器的绑定,并可能弄乱您的路线...