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
http: // stackoverflow.com/questions/21949298/how-to-add-slug-and-id-url-to-laravel-4-route – JofryHS
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. –
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