laravel中的动态网址?

时间:2012-12-13 12:46:24

标签: php database dynamic routes laravel

我正在考虑switching to laravel我的下一个项目。

我的下一个项目可能是一个带有一些静态页面的小站点,一个博客和一个项目经理,并且将使用控制器而不是路径。

我很好奇的是如何管理Laravel中的动态路线。

基本上,我想构建一个管理部分,以便我可以轻松地动态创建静态页面,静态页面将具有SEO焦点网址,例如http://domain.com/when-it-started我不想为每个页面手动创建新的控制器或路由。

所以我想知道最清洁的方法是什么。

基本上所有静态页面都将共享相同的视图,只需要更改几个变量。

动态路由应该使用控制器而不是。

E.g。如果我们有一个带有函数about的控制器staff,那么这应该通过http://domain.com/about/staff加载

但是我们没有函数players,所以对http://domain.com/about/players的调用应该检查数据库以查看动态路由是否存在并匹配。如果确实显示,则显示404页面。同样对于不存在的控制器。 (例如,不会有when-it-started控制器!)

选择的答案在Laravel 4中似乎不起作用。对此有任何帮助吗?

3 个答案:

答案 0 :(得分:17)

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'));

答案 1 :(得分:8)

您可以使用路线通配符作为工作,您可以从(:any)开始,如果您需要多个网址段,请添加一个可选的(:all?),然后从slug中识别该页面。

例如:

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);
});

答案 2 :(得分:2)

与查尔斯的答案非常相似,但在控制器中:

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]+');`

...它有额外的好处,可以让你轻松地直接链接到索引页面上的slug路线,例如:

@foreach ($posts as $post)
    <h2>{{ HTML::link(
        action('PostsController@showBySlug', array($post->slug)),
        $post->title
    )}}</h2>
@endforeach