public function boot() {
parent::boot();
// para hacer que coga el id del slug por si se cambie el slug tire siempre del id
Route::bind('entry', function($value) {
$arrAux = explode("-", $value);
$id = end($arrAux);
return Entry::findOrFail($id);
});
}
En \config\database.php en mysql poner:
'strict' => false,
En el migration de esa tabla añadir:
$table->string('slug');
En el modelo que queramos hacer el slug (por ejemplo Entry.php):
// crear un mutator para el slug
public function setTitleAttribute($value) {
$this->attributes['title'] = $value;
$this->attributes['slug'] = Str::slug($value);
}
// para q el controller busque por ese campo en vez de por el id
public function getRouteKeyName() {
return 'slug';
}
// esto es para q desde las views sea más cómodo y no haya q escribir tanto
public function getUrl() {
return url('entries/'.$this->slug.'-'.$this->id);
}
Y finalmente en la vista en la q se enlace:
<a href="{{ $item->getUrl() }}">
{{ $item->title}}
</a>
En routes/web.php no hay que cambiar absolutamente nada pues va a seguir entrando como parámetro un objeto $entry pero en vez de buscarlo por id lo hará por el slug
Ejecutar para generar todo de nuevo:
php artisan migrate:fresh --seed
No hay comentarios:
Publicar un comentario