web-dev-qa-db-ja.com

Laravel指定されたURLからルート名を取得する

Laravelでは、次の方法で現在のURLからルート名を取得できます。

Route::currentRouteName()

しかし、特定のURLからルート名を取得するにはどうすればよいでしょうか。

ありがとうございました。

15
user1995781

それを行うための非常に簡単な方法_Laravel 5.2_

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

ルート名は次のように出力されます_slug.posts.show_

Update[〜#〜] 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などの複数の便利なパブリックメソッドを呼び出すことができます。ソースを確認してください https://github.com/illuminate/routing/blob/master/Route.php 詳細については。

26

すぐに使えるLaravelではこれができないと思います。また、Laravelのすべてのルートに名前が付けられているわけではないため、ルート名ではなくルートオブジェクトを取得する必要があることにも注意してください。

考えられる解決策の1つは、デフォルトの_\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));
    }
}
_

このshouldは、指定したURLに一致するルートを返しますが、実際にはテストしていません。

この新しいカスタムルーターを組み込みルーターに置き換える場合は、新しいサービスプロバイダーを作成して、デフォルトのクラスではなく、新しいクラスをIoCコンテナーに登録する必要があることに注意してください。

以下のコードのServiceProviderをニーズに合わせて調整できます。

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

それ以外の場合、必要に応じてコードでカスタムルーターを手動でインスタンス化するだけの場合は、次のような操作を行う必要があります。

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

デフォルトの_\Iluminate\Routing\Router_クラスを拡張せずに実行できます。

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

dispatchToRoute呼び出しの後にRoute::currentRouteName()を呼び出すと、ディスパッチされたリクエストの現在のルート名が返されます。

3
Shahid

上記の解決策はどれも私にはうまくいきませんでした。

これは、ルートをURIと一致させる正しい方法です。

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

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

他のソリューションはコンテナへのバインディングを実行し、ルートを台無しにする可能性があります...

2
BassMHL