Как использовать ID и slug в URL маршрута Laravel 4? (resource / id / slug)
Я хотел бы использовать ID и slug в моем маршруте статей. Так вместо /articles/ID
Я хочу /articles/ID/slug
.
мне на самом деле не нужна переменная slug ни для чего; она просто там, чтобы сделать URL более читаемым и SEO, поэтому я буду использовать ID
как идентификатор для извлечения изделий.
если URL /articles/ID
вводится я хочу перенаправить на /articles/ID/slug
. Должно быть исключение для /articles/ID/edit
так как это открывает форму для редактирования статья.
я погуглил и посмотрел этот сайт,но я нашел только примеры замены ID на slug, не включая оба.
как я могу этого достичь? И могу ли я использовать URL
класс, чтобы получить полный URL-адрес (/articles/ID/slug
) для статьи?
текущая конфигурация маршрута:
Route::resource('articles', 'ArticlesController');
1 ответов
Итак, вот что я делал:
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']]);
добавил 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, у меня изначально было что-то в моем классе модели. Но переехал он к представление классов ведущий на основе этот ответ: 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);
}
View, получить url-адрес от View presenter:
@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