2014-08-29 11 views
9

Mi piacerebbe utilizzare sia ID che slug nel mio percorso degli articoli. Quindi invece di /articles/ID voglio /articles/ID/slug.Come utilizzare ID e slug nell'URL del percorso di Laravel 4? (resource/id/slug)

In realtà non ho bisogno della variabile slug per nulla; è solo lì per rendere l'URL più leggibile e SEO, quindi userò ID come identificatore per recuperare gli articoli.

Se si immette l'URL /articles/ID, desidero reindirizzare a /articles/ID/slug. Deve esserci un'eccezione per poiché questo apre il modulo per la modifica dell'articolo.

Ho cercato su Google questo sito, ma ho trovato solo esempi di sostituzione di ID con slug, non includo entrambi.

Come posso ottenere questo risultato? E posso usare la classe URL per ottenere l'URL completo (/articles/ID/slug) per un articolo?

percorso attuale configurazione:

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

http: // stackoverflow.com/questions/21949298/how-to-add-slug-and-id-url-to-laravel-4-route – JofryHS

+0

Ho visto quel post, e dice: "Il mio obiettivo è continuare a utilizzare Numbers * * ma anche per usare Slugs ** per migliori URL SEO ". Voglio usare entrambi. –

+1

Probabilmente sarà ancora molto vicino alla prima risposta a quel post. In questo caso probabilmente starai meglio senza ':: resource', dal momento che devi specificare un parametro extra per la tua lumaca. Qualcosa come ':: controller ('articoli/{id}/{slug?}', ArticlesController ');' potrebbe fare il trucco – JofryHS

risposta

9

Così, qui è quello che ho finito per fare:

routes.php, creato un percorso personalizzato per show e edit. Utilizzato una risorsa per il resto:

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

Controller, ha aggiunto un parametro slug di input con un valore predefinito. Reindirizzare la richiesta se la lumaca è mancante o non corretta, in modo che reindirizzerà se il titolo è cambiato e restituire un HTTP 301 (definitivamente trasferita):

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 presentatore, Inizialmente avevo qualcosa nella mia classe del modello. Ma spostato a una classe di visualizzazione presentatore in base a questa risposta: https://stackoverflow.com/a/25577174/3903565, installato e utilizzato in questo modo: 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, ottenere l'URL dal presentatore vista:

@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 
Problemi correlati