web-dev-qa-db-ja.com

Laravelの動的URL?

私は次のプロジェクトのために 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では機能しないようです。それについて何か助けはありますか?

23
Hailwood

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'));
17
Deji S

ジョブにルートワイルドカードを使用できます。(: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);
});
8
TLGreg

チャールズの答えと非常に似ていますが、コントローラー内にあります。

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
2
Adam Marshall