laravel中的动态网址?

Posted

技术标签:

【中文标题】laravel中的动态网址?【英文标题】:Dynamic urls in 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 提供的链接讨论 好的。我会阅读整个问题,然后判断它是否需要一些编辑。并且只编辑拼写错误和未突出显示的代码。 【参考方案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

【讨论】:

以上是关于laravel中的动态网址?的主要内容,如果未能解决你的问题,请参考以下文章

如何运行位于laravel项目中的目录

模型中的 Laravel 动态可填充

如何使laravel中的动态表单字段可填写

Laravel:模型中的动态关系

Laravel 中的动态数据库更改

Laravel 路由参数除了