Laravel 7: Slug

Lo primero de todo en App/providers/RouteServideProvider.php modificar la función boot:
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