Laravel从给定的URL获取路由名称

时间:2014-07-05 04:19:17

标签: php laravel routing

在Laravel中,我们可以通过以下方式从当前URL获取路线名称:

Route::currentRouteName()

但是,我们如何从特定的给定URL获取路由名称?

谢谢。

4 个答案:

答案 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个实例,您可以在其中调用多个有用的公共方法,例如getActiongetValidators等。检查来源{{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));
});

其他解决方案执行到容器的绑定,并可能弄乱您的路线...