2015-10-07 19 views
10

私は、複数のセグメントを持つことができるURLの動的ルーティングを手伝ってくれることを願っています。私はウェブ上でいくつかの検索を行ってきましたが、私が見つけたものは何も私の特定の状況で私を助けません。Laravel 5アプリケーションの動的ルーティング

少し背景...数年前、私はCodeIgniter上に構築されたカスタムクライアントのWebサイト用のCMSパッケージを開発しました。このCMSパッケージには、いくつかのモジュール(ページ、ブログ、カレンダー、お問い合わせなど)があります。 Pagesモジュールでは、ページのID(ルート、親、祖父母など)の完全なルートに関連する「カスタムルート」設定ファイルへのルートをキャッシュしていました。私はこれを行って、表示するページを見つけるためにデータベース検索を行う必要がないようにしました。

現在、私はLaravel(5.1)を使ってこのCMSパッケージを再構築しようとしています。ルーティングの状況を把握してから、ページモジュールを新しいバージョンのパッケージに移行する必要があります。

// routes.php 
Route::get('{slug}', ['uses' => '[email protected]']); 

// PageController.php 
class PageController extends Controller 
{ 
    public function view($slug) 
    { 
     // do a query to get the page by the slug 
     // display the view 
    } 
} 

私は私のような何かを行うことができることを知って

...そして私は、ネストされたページを許可していませんでしたが、私がしなければ、これは動作します。そして、私は親に基づいてスラグの唯一性を強制する。だから私は、... ファーゴのスラグと

私はCodeIgniterのを使用して構築されたパッケージと同様に
  • 場所/ファーゴ
  • スタッフ/ファーゴ

複数のページがあるかもしれません表示する正しいページを見つけるために余分なデータベース参照を避けることができるようにしたいと考えています。

私の初期の考えは、システムの古いバージョンと同じように動的なルートを持つ設定ファイルを作成することでした。ルートは特定の時刻(ページが作成されたとき、親が変更されたときに変更されたとき)にのみ変更されるので、それらを「キャッシュする」と効果的です。しかし、私はまだLaravelの新しさですから、これについての最良の方法は何か分かりません。

次のルートが動作することがわかりました。しかし、これを設定するにはこれが最善の方法ですか?

Route::get('about/foobar', function(){ 
    return App::make('\App\Http\Controllers\PageController')->callAction('view', [123]); 
}); 

Route::get('foobar', function(){ 
    return App::make('\App\Http\Controllers\PageController')->callAction('view', [345]); 
}); 

基本的に、私は、ページが作成されたとき(またはスラグまたは親が変更された場合)特定のページIDに特定のルートをバインドしたいと思います。

私は物事を過度に複雑化していますか?

これに関するお手伝いやご指摘をいただければ幸いです。

ありがとうございます!

+0

「私は物事を過度に複雑にしていますか?」、IMO「はい」。また、これらのルートは静的に見えますが、 'ID'のプレースホルダーを許可しないとダイナミズムはありません。各経路はただ一つの特定の 'id'に束縛されています。 –

+0

どのように設定する予定ですが、正しいページを見つけるために追加のデータベースクエリを実行する必要のない動的ルートを使用する方法はないと思います。私はブログのような他のモジュールのための動的ルートを使用しますが、通常のページでは、うまくいくとは思いません。 – Becky

答えて

18

私が扱うのは、ホームページ(一般的にはニュースのようなより複雑なロジックを含んでいて、記事、バナーなどをピックアップする)と他のページのキャッチの両方に2つのルートを使用することです。

ルート

// Home page 
Route::get('/', [ 
    'as'  => 'home', 
    'uses' => '[email protected]' 
]); 

// Catch all page controller (place at the very bottom) 
Route::get('{slug}', [ 
    'uses' => '[email protected]' 
])->where('slug', '([A-Za-z0-9\-\/]+)'); 

上記で注意すべき重要な部分は、経路の端部に連鎖->where()方法です。これにより、ルートパラメータの正規表現パターンマッチングを宣言することができます。この場合は、{slug}パラメータの英数字、ハイフン、スラッシュを許可しています。

これは、私は、ユーザーがでテンプレートを作成することができますように私は、データベース内のテンプレートファイル情報を保持し
test-page
test-page/sub-page
another-page/sub-page

PageControllerでメソッド

public function index() 
{ 
    $page = Page::where('route', '/')->where('active', 1)->first(); 

    return view($page->template) 
     ->with('page', $page); 
} 

public function getPage($slug = null) 
{ 
    $page = Page::where('route', $slug)->where('active', 1); 

    $page = $page->firstOrFail(); 

    return view($page->template)->with('page', $page); 
} 

のようなナメクジと一致しますコンテンツ管理システム。

データベースのクエリからの応答が、それは、メタデータに出力することができるビュー、ページ、ブレッドクラムに渡されるなど

+0

私は自分の質問で言及したように、2つの異なるページに同じ親がいる場合、同じスラッグを持つことができます。だから私はあなたが提案したことをすることはできません。そして私は正しい親を見つけるために複数のルックアップを行う必要はありません。 – Becky

+0

@Beckyデータベース内のslugカラムには、FULLスラッグが含まれています。 IE。 '場所/ファーゴ'。そうすれば、重複を心配する必要はありません。あなたのスラッグの最後のセグメントのみを使用する理由はありますか? – Jeemusu

+0

スラッグはタイトルに基づいたページに過ぎません。あなたが提案したものは完全なパーマリンクです。それは私が探しているものではありません。 – Becky

-7

私はまた、作成についてです同じ答えを探していましたあなたはlaravelのメソッドハローでのPostControllerを持っている場合はroutes.phpの

<?php 


/* 
|-------------------------------------------------------------------------- 
| Application Routes 
|-------------------------------------------------------------------------- 
| 
| Here is where you can register all of the routes for an application. 
| It's a breeze. Simply tell Laravel the URIs it should respond to 
| and give it the controller to call when that URI is requested. 
| 
*/ 

$str=Request::url(); 
$del="/public/"; 
$pos=strpos($str, $del); 
$important1=substr($str, $pos+strlen($del), strlen($str)-1); 
$important=ucfirst($important1); 
$asif=explode("/", $important); 
$asif1=explode("/", $important1); 
//echo $important; 
$post=$asif1[0]; 
$post1=$asif1[1]; 
if(isset($asif1[2])) 
{ 
    $post2=$asif1[2]; 
} 
if(!(isset($post2))) 
{ 
    Route::match(array('GET','POST'),$important1, $asif[0].'[email protected]'.$asif[1]); 
} 
if(isset($post2)) 
{  Route::match(array('GET','POST'),$post.'/'.$post1.'/{id}',$asif[0].'[email protected]'.$asif[1]); 
} 
Route::get('/', function() { 
    return view('welcome'); 
}); 

:laravelでのダイナミックルーティングは私はこの思い付きます。あなたはこのURLを使用することができますhttp://localhost/shortproject/public/post/hello。ここで、shortprojectはプロジェクトのフォルダ名です。

関連する問題