2014-08-29 14 views
9

Makaleler rotamda hem ID hem de slug kullanmak istiyorum. Yani /articles/ID yerine /articles/ID/slug istiyorum.Laravel 4 yol URL'sinde hem kimlik hem de sümük nasıl kullanılır? (resource/id/slug)

Aslında hiçbir şey için sülük değişkenine ihtiyacım yok; URL daha okunabilir ve SEO yapmak için sadece orada, bu yüzden makaleleri almak için tanımlayıcı olarak ID kullanıyorum.

URL /articles/ID girilirse, /articles/ID/slug adresine yeniden yönlendirmek istiyorum. Bu, makaleyi düzenlemek için formu açtığından, /articles/ID/edit için bir istisna olmak zorundadır.

Siteye baktım ve bu siteye baktım, ancak her ikisini de içermeyen kimliğe sahip kimlikleri değiştirme örneklerini buldum.

Bunu nasıl başarabilirim? Ve bir makalenin tam URL'sini (/articles/ID/slug) almak için URL sınıfını kullanabilir miyim?

Güncel rota yapılandırma:

routes.phpshow ve edit için özel bir rota oluşturuldu:

Route::resource('articles', 'ArticlesController'); 
+0

http: 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); } 

Görünüm, görünüm sunucu gelen url olsun // stackoverflow.com/questions/21949298/how-to-add-slug-and-id-url-to-laravel-4-route – JofryHS

+0

Bu yazıyı gördüm ve diyor ki: "Amacım Numaraları kullanmaya devam etmektir * * Ama aynı zamanda daha iyi SEO URL'leri için Slugs ** kullanmak için. İkisini de kullanmak istiyorum. –

+1

Bu yazıya verilen ilk cevaba muhtemelen çok yakın olacaktır. Bu durumda, sümüğünüz için ekstra parametre belirlemeniz gerektiğinden, “kaynak” olmadan muhtemelen en iyi durumda olacaksınız. Bir şey :: :: denetleyici ('makaleler/{id}/{slug?}', ArticlesController '); 'hile yapabilir – JofryHS

cevap

9

Yani, burada yaptığım sona erdi budur. geri kalanı için bir kaynak kullanılmış:

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']]); 

Kontrolörü, varsayılan bir değere sahip bir slug giriş parametresi eklendi. sümüklüböcek eksik veya yanlış ise isteği yönlendir, böylece başlık değiştirilirse yönlendirmek ve bir HTTP 301 (kalıcı olarak taşındığını) döndürür:

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) 
    ]); 
} 

Görünüm sunum, Başlangıçta benim modeli sınıfında bir şey vardı. yüklü, https://stackoverflow.com/a/25577174/3903565 ve bu kullandı:: Ama bu cevabın temelinde bir görünüm sunum sınıfa taşındı

@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 
İlgili konular