Vì vậy, đây là những gì tôi đã kết thúc thực hiện:
routes.php
, tạo ra một lộ trình tùy chỉnh cho show
và edit
. Đã sử dụng tài nguyên cho phần còn lại:
Route::pattern('id', '[0-9]+');
Route::get('articles/{id}/{slug?}', ['as' => 'articles.show', 'uses' => '[email protected]']);
Route::get('articles/edit/{id}', ['as' => 'articles.edit', 'uses' => '[email protected]']);
Route::resource('articles', 'ArticlesController', ['except' => ['show', 'edit']]);
Bộ điều khiển, thêm slug
thông số đầu vào với giá trị mặc định. Chuyển hướng yêu cầu nếu sên bị thiếu hoặc không chính xác, vì vậy nó sẽ chuyển hướng nếu tiêu đề được thay đổi và trả về một HTTP 301 (vĩnh viễn chuyển):
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)
]);
}
Xem người dẫn chương trình, tôi ban đầu đã có một cái gì đó trong lớp mô hình của tôi. Nhưng di chuyển nó vào một lớp học xem người dẫn chương trình trên cơ sở câu trả lời này: https://stackoverflow.com/a/25577174/3903565, cài đặt và sử dụng này: 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);
}
View, lấy url từ người dẫn chương trình xem:
@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
http: // stackoverflow.com/questions/21949298/how-to-add-slug-and-id-url-to-laravel-4-route – JofryHS
Tôi đã xem bài đăng đó và anh ấy nói: "Mục tiêu của tôi là tiếp tục sử dụng Số * * mà còn sử dụng Slugs ** cho URL tốt hơn của SEO ". Tôi muốn sử dụng cả hai. –
Nó có lẽ vẫn sẽ rất gần với câu trả lời đầu tiên cho bài đăng đó. Trong trường hợp này, bạn có thể sẽ là tốt nhất mà không có ':: resource', vì bạn cần chỉ định tham số bổ sung cho slug của bạn. Một cái gì đó như ':: điều khiển ('bài viết/{id}/{slug?}', ArticlesController ');' có thể làm các trick – JofryHS