簡體   English   中英

Laravel 從給定的 URL 獲取路由名稱

[英]Laravel get route name from given URL

在 Laravel 中,我們可以通過以下方式從當前 URL 獲取路由名稱:

Route::currentRouteName()

但是,我們如何從特定的給定 URL 獲取路由名稱?

謝謝你。

一個非常簡單的方法來做到這一點Laravel 5.2

app('router')->getRoutes()->match(app('request')->create('/qqq/posts/68/u1'))->getName()

它像這樣輸出我的路線名稱slug.posts.show

更新:對於像POSTPUTDELETE這樣的方法,你可以這樣做

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等。查看源https://github.com/illuminate/routing/blob/master/Route.php了解更多詳細信息。

上述解決方案都不適合我。

這是將路由與 URI 匹配的正確方法:

$url = 'url-to-match/some-parameter';

$route = collect(\Route::getRoutes())->first(function($route) use($url){
   return $route->matches(request()->create($url));
});

其他解決方案執行到容器的綁定,並可能搞砸你的路線......

我不認為這可以用開箱即用的 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));
    }
}

應該返回與您指定的 URL 匹配的路由,但我還沒有實際測試過。

請注意,如果您希望這個新的自定義路由器替換內置路由器,您可能還需要創建一個新的 ServiceProvider 來將您的新類注冊到 IoC 容器中,而不是默認的。

您可以根據您的需要調整以下代碼中的 ServiceProvider:

https://github.com/jasonlewis/enhanced-router

否則,如果您只想根據需要在代碼中手動實例化自定義路由器,則必須執行以下操作:

$myRouter = new MyRouter(new \Illuminate\Events\Dispatcher());
$route = $myRouter->resolveRouteFromUrl('/your/url/here');

它可以在不擴展默認\\Iluminate\\Routing\\Router類的情況下完成。

    Route::dispatchToRoute(Request::create('/your/url/here'));
    $route = Route::currentRouteName();

如果在dispatchToRoute調用之后調用Route::currentRouteName() ,它將返回已調度請求的當前路由名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM