Как использовать 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