如何在Laravel 4的路由URL中同时使用ID和slug?(resource/id/slug)

8 浏览
0 Comments

如何在Laravel 4的路由URL中同时使用ID和slug?(resource/id/slug)

我想在我的文章路由中同时使用ID和slug。所以,不再使用/articles/ID,而是使用/articles/ID/slug。\n实际上,我并不需要slug变量做任何事情;它只是为了让URL更易读和SEO友好,所以我将使用ID作为检索文章的标识符。\n如果输入URL/articles/ID,我希望重定向到/articles/ID/slug。但对于/articles/ID/edit,需要例外,因为这是打开编辑文章表单的操作。\n我已经在谷歌和这个网站上搜索过,但只找到了替换ID为slug的示例,没有包含两者的示例。\n我该如何实现这一点?我可以使用URL类来获取文章的完整URL(/articles/ID/slug)吗?\n当前的路由配置:\nRoute::resource(\'articles\', \'ArticlesController\');

0
0 Comments

问题的原因是在Laravel 4中如何同时使用ID和slug来构建路由URL。解决方法是通过在路由中定义自定义路由并使用资源路由的方式来处理。

首先在`routes.php`文件中,我们为`show`和`edit`创建了自定义路由,并为其他的路由使用了资源路由。代码如下:

Route::pattern('id', '[0-9]+');
Route::get('articles/{id}/{slug?}', ['as' => 'articles.show', 'uses' =>   'ArticlesController']);
Route::get('articles/edit/{id}', ['as' => 'articles.edit', 'uses' => 'ArticlesController']);
Route::resource('articles', 'ArticlesController', ['except' => ['show', 'edit']]);

在控制器中,我们为`show`方法添加了一个`slug`的输入参数,并设置了默认值。如果缺少或不正确的slug,我们将重定向请求,这样当标题更改时将返回HTTP 301(永久移动)。

public function show($id, $slug = null)
{
    $post = Article::findOrFail($id);
    if ($slug != Str::slug($post->title))
        return Redirect::route('articles.show', array('id' => $post->id, 'slug' => Str::slug($post->title)), 301);
    return View::make('articles.show', [
        'article' => Article::with('writer')->findOrFail($id)
    ]);
}

在视图中,我们使用视图展示器(view presenter)来获取URL。

($articles as $article)
    

{{ HTML::link($article->present()->url, $article->title) }} by {{ $article->writer->name }}

{{ $article->present()->stump }}

最后,我们可以在视图展示器中定义`url()`和`stump()`方法来获取URL和文章的摘要。

public function url()
{
    return URL::route('articles.show', array('id' => $this->id, 'slug' => Str::slug($this->title)));
}
public function stump()
{
    return Str::limit($this->content, 500);
}

0