Tho*_*sen 11 php seo laravel-4
我想在我的文章路线中同时使用ID和slug.而不是/articles/ID我想要的/articles/ID/slug.
我实际上并不需要slug变量; 它只是为了使URL更具可读性和SEO,所以我将ID用作检索文章的标识符.
如果/articles/ID输入了URL ,我想重定向到/articles/ID/slug.必须有一个例外,/articles/ID/edit因为这会打开用于编辑文章的表单.
我用谷歌搜索并查看了这个网站,但我只找到了用slug替换ID的例子,不包括两者.
我怎样才能做到这一点?我可以使用URL该类获取文章的完整URL(/articles/ID/slug)吗?
当前路由配置:
Route::resource('articles', 'ArticlesController');
Run Code Online (Sandbox Code Playgroud)
Tho*_*sen 11
所以,这是我最终做的事情:
routes.php,为show和创建了自定义路由edit.使用剩下的资源:
Route::pattern('id', '[0-9]+');
Route::get('articles/{id}/{slug?}', ['as' => 'articles.show', 'uses' => 'ArticlesController@show']);
Route::get('articles/edit/{id}', ['as' => 'articles.edit', 'uses' => 'ArticlesController@edit']);
Route::resource('articles', 'ArticlesController', ['except' => ['show', 'edit']]);
Run Code Online (Sandbox Code Playgroud)
Controller,添加了一个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)
]);
}
Run Code Online (Sandbox Code Playgroud)
查看演示者,我最初在我的模型类中有一些东西.但在此答案的基础上将其移至视图演示者类:https://stackoverflow.com/a/25577174/3903565,安装并使用此:https://github.com/laracasts/Presenter
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);
}
Run Code Online (Sandbox Code Playgroud)
查看,从视图演示者处获取网址:
@foreach($articles as $article)
<article>
<h3>{{ HTML::link($article->present()->url, $article->title) }} <small>by {{ $article->writer->name }}</small></h3>
<div class="body">
<p>{{ $article->present()->stump }}</p>
<p><a href="{{ $article->present()->url }}"><button type="button" class="btn btn-default btn-sm">Read more...</button></a></p>
</div>
</article>
@endforeach
Run Code Online (Sandbox Code Playgroud)