2016-04-06 18 views
2

質問は明らかです。Route :: getRoutes()によって特定のパスのルートを取得するlaravelメソッド

我々はRoute::getRoutes()方法で、このようなlaravelプロジェクトで定義されたすべてのルートを得ることができることを知っている:

$routeCollection = Route::getRoutes(); 
$arr = []; 

foreach ($routeCollection as $value) { 
    $arr[] = $value->getPath(); 
} 

return array_unique($arr); 

をしかし、私は例/adminのための特定のパスで定義されたすべてのルートを取得したいです。

私はパス名をgetRoutes()に渡すことができると思っていますが、私にとってはうまくいきません。

どうすればいいですか?

答えて

3

ここでLaravelのコレクションを利用したソリューションです配列はで始まるルートパスのリストを返します。ここではそこに何が起こっているかです:Route::getRoutes()を使用して

  • Illuminate\Routing\Routeインスタンスの平らな配列を返す独自のgetRoutesメソッドを持っていRoutesCollectionを返します。それをcollectメソッドに渡すと、これらのルートすべてのCollectionが返されます。

  • adminで始まらない値を削除するだけで済みます。これがfilterメソッドで簡単に実現できる値の単純な配列だったのですが、これはオブジェクトの配列なので、getPathへのメソッド呼び出しでしかアクセスできないpath文字列を使用できるようにするには、コレクションのreduceメソッドを使用できます代わりに回避策として。パスがadminなく/adminで始まる場合

また、あなたはその条件チェックに気付くでしょう。これは、ルートコレクションを構築するときにLaravelルーターが自動的に先頭のスラッシュを取り除くためです。


Laravel Documentationのコレクションについて詳しく読むことができます。

+0

私はlaravelを5.5にアップグレードしましたが、エラー: 'メソッドgetPathは存在しません.'。削除されたようです。それに代わるものはありますか? –

1

あなたはthis apporachを使用することができます。

$routeCollection = Route::getRoutes(); 
$adminRoutes = []; 

foreach ($routeCollection as $value) { 
    strpos($value->getPath(), 'admin') === false ?: $adminRoutes[] = $value->getPath(); 
} 
+1

'getRoutes()'メソッドは 'RoutesCollection'インスタンスを返します。通常の' Collection'とは異なり、 'where'メソッドを持たないので動作しません。あなたの答えを改訂してください。 – Bogdan

+0

今、私は、感謝を知ります。この場合、最良の方法は単純なループを使ってルートをフィルタリングすることだけです。私は私の答えを更新しました。 –

1

私は正規表現のために行くだろう:

$routes = collect(Route::getRoutes()->getRoutes())->reduce(function ($carry = [], $route) { 
    !starts_with($route->getPath(), 'admin') ?: $carry[] = $route->getPath(); 

    return $carry; 
}); 

今そうroutes

$routeCollection = Route::getRoutes(); 
    $arr    = []; 

    foreach ($routeCollection as $value) { 
     if (preg_match('/^\/?admin/', $value->getPath())) { 
      $arr[] = $value->getPath(); 
     } 
    } 
    $filteredRoutes = array_unique($arr); 
関連する問題