23

我正在考虑为我的下一个项目切换到 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 中不起作用。对此有什么帮助吗?

4

3 回答 3

18

对于 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'));
于 2013-04-03T11:42:34.860 回答
8

您可以为作业使用路由通配符,您可以从一个开始(:any),如果您需要多个 url 段添加一个可选的(: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);
});
于 2012-12-13T13:35:03.820 回答
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
于 2014-02-14T17:27:38.193 回答