【问题标题】:Dynamic urls in laravel?laravel中的动态网址?
【发布时间】:2012-12-01 08:40:34
【问题描述】:

我正在为我的下一个项目寻找 switching to 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 中不起作用。对此有什么帮助吗?

【问题讨论】:

  • @anujarora 任意用粗体强调问题/答案的词语以“更好地突出”不被认为是一个好的编辑。实际上,它可以被认为是有害的。请看一下Is editing posts to only introduce bold emphasis acceptable?
  • 我没有为强调而付出额外的努力。我只强调了应该引起注意并有助于更好理解的词。
  • @anujarora 但 Xavi 的观点是这种编辑类型被社区的大多数成员认为是不可接受的。修正语法和拼写很好,但添加“强调”并不是要添加到帖子中的内容。请到 Xavi 提供的链接讨论
  • 好的。我会阅读整个问题,然后判断它是否需要一些编辑。并且只编辑拼写错误和未突出显示的代码。

标签: php database dynamic routes laravel


【解决方案1】:

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

【讨论】:

  • 它是如何工作的?页面是模型?视图/控制器的要求是什么?
  • 是页面是一个模型,更新后显示使用控制器和视图的代码。希望对您有所帮助。
【解决方案2】:

您可以在作业中使用路由通配符,您可以从 (: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);
});

【讨论】:

    【解决方案3】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2021-04-27
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      • 2013-08-17
      • 2012-03-15
      • 2011-01-10
      • 2012-04-17
      相关资源
      最近更新 更多