私は次のプロジェクトのために laravelへの切り替え を見ています。
私の次のプロジェクトは、おそらくいくつかの静的ページ、ブログ、プロジェクトマネージャーを備えた小さなサイトであり、ルートではなくコントローラーを使用する予定です。
私が興味を持っているのは、Laravelで動的ルートを管理する方法です。
基本的に、静的ページをその場で簡単に作成できるように、管理セクションを組み込みたいと思います。静的ページには、SEOに焦点を合わせたURLが含まれます。 http://domain.com/when-it-started 新しいコントローラーを作成したり、ページごとに手動でルーティングしたりする必要はありません。
だから私はこれを処理するための最もクリーンな方法は何であるか疑問に思っています。
基本的に、すべての静的ページは同じビューを共有しますが、変更する変数はわずかです。
動的ルーティングは、代わりにではなく、コントローラーで動作する必要があります。
例えば。関数about
を持つコントローラーstaff
がある場合、これは http://domain.com/about/staff を介してロードする必要があります。
ただし、関数players
がないため、 http://domain.com/about/players を呼び出すと、データベースをチェックして、動的ルートが存在し、一致するかどうかを確認する必要があります。それが表示される場合は、それ以外の場合は404ページを表示します。存在しないコントローラーについても同様です。 (たとえば、when-it-started
コントローラーはありません!)
選択した答えはLaravel 4では機能しないようです。それについて何か助けはありますか?
Laravel 4の場合これを行う
Route::get('{slug}', function($slug) {
$page = Page::where('slug', '=', $slug)->first();
if ( is_null($page) )
// use either one of the two lines below. I prefer the second now
// return Event::first('404');
App::abort(404);
return View::make('pages.show', array('page' => $page));
});
// for controllers and views
Route::get('{page}', array('as' => 'pages.show', 'uses' => 'PageController@show'));
ジョブにルートワイルドカードを使用できます。(:any)
で開始し、複数のURLセグメントが必要な場合は、オプションの(:all?)
を追加して、スラッグからページを識別します。
例えば:
Route::get('(:any)', function($slug) {
$page = Page::where_slug($slug)->first();
if ( is_null($page) )
return Event::first('404');
return View::make('page')->with($page);
});
チャールズの答えと非常に似ていますが、コントローラー内にあります。
public function showBySlug($slug) {
$post = Post::where('slug','=',$slug)->first();
// would use app/posts/show.blade.php
return View::make('posts.show')->with(array(
'post' => $post,
));
}
次に、次のようにルーティングできます。
Route::get('post/{slug}', 'PostsController@showBySlug')
->where('slug', '[\-_A-Za-z]+');`
...これには、インデックスページのスラッグルートに直接リンクする簡単な方法を可能にするという追加のボーナスがあります。次に例を示します。
@foreach ($posts as $post)
<h2>{{ HTML::link(
action('PostsController@showBySlug', array($post->slug)),
$post->title
)}}</h2>
@endforeach