24. Cómo generar url's amigables
En este capítulo de Laravel, aprenderás a utilizar la función getRouteKeyName para crear URL amigables y fáciles de recordar para tus modelos en Laravel. Con getRouteKeyName, puedes especificar el nombre de un campo de tu modelo para que sea utilizado como clave en lugar del id predeterminado. Esto te permitirá crear URLs más legibles y semánticamente significativas para tus usuarios, lo que a su vez mejorará la experiencia del usuario y el SEO de tu sitio. Aprenderás cómo implementar getRouteKeyName en tu proyecto Laravel y cómo personalizar tus URL utilizando los nombres de campo que mejor se adapten a tus necesidades.
9 comentarios
Inicia sesión para comentar
Comentarios:
-
Elis Morán hace 8 meses
Aplique las indicaciones d elos comentarios, pero sigo sin poder crear un curso, me da error Missing required parameter for [Route: cursos.show] [URI: cursos/{curso}] [Missing parameter: curso].
-
Jordi Fernandez hace 1 año
Buenas a mi en Laravel 10 no me funciona. Al cambiar getRouteKeyName() no me recupera el curso sabeis porque puede estar pasando?
-
Victor Arana Flores hace 1 año
Seguramente no tienes el nombre de campo que has pedido usar.
-
-
Martzdev hace 1 año
Quienes tengan error al momento de guardar un curso deben agregar en el modelo: // asignacion masiva protected $fillable = ['nombre', 'descripcion', 'categoria', 'precio']; // creamos el slug con base al campo nombre protected static function boot() { parent::boot(); static::creating(function ($request) { $request->slug = Str::slug($request->nombre); }); } // obtenemos la URI de la ruta mediante slug y no por id public function getRouteKeyName() { return 'slug'; }
-
Bruno Decruz hace 1 año
un grande
-
Javi hace 1 año
Buenas Victor, lo primero de todo darte las gracias por tus cursos, te explicas muy bien y de una forma fácil de comprender.
Sobre este bloque quería añadir que si vamos a trabajar con “slugs” y vamos a buscar por las mismas, sería interesante que al crear este campo lo hagamos de tipo “unique” ya que vamos a tener un problema si tenemos dos url con el mismo nombre.
Un saludo y gracias por los aportes!
-
Walter hace 2 años
? Comenzamos añadiéndole a la migración de cursos un campo llamado slug:
$table->string('slug');
Actualizamos el factory haciendo uso de:
use Illuminate\Support\Str;
Definimos la variable $name en el método definition():
$name = $this->faker->sentence();
En el array que devuelve:
'name' => $name; 'slug' => Str::slug($name, '-');
Ejecutamos la migración:
php artisan migrate:fresh --seed
El método que nos permite recuperar el id a partir de $cursos es getRouteKeyName() y se encuentra en vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php, el cual redefinimos en el modelo app\Models\Curso.php:
public function getRouteKeyName() { return 'slug'; }
-
Jerónimo Sánchez hace 1 año
En el canal de youtube de Coders Free nos respondió a este tema el usuario Jose María Barragan. A lo anterior mencionado por Walter habría que añadir …
Dos pasos:
1. En el blade create y edit, debajo del error por Name, agregar:
<input type="hidden" name="slug" value="slug">2. En el controlador antes del curso->update del edit o curso->create del store, agregar:
$request->merge([
'slug' => Str::slug($request->name),
]); -
Carlos Romero hace 11 meses
Ya no están los comentarios, es una pena quería guiarme para mis errores. :(
-
-
Ruben hace 2 años
Como puedo solucionar este problema, pro favor
-
Victor Arana Flores hace 2 años
Agrega en tu formulario de crear registro, el campo slug, y mandaselo junto con los demas campos
-
Ruben hace 2 años
okis, gracias
-
-
Joseph Rodelo Suarez hace 2 años
Buenas Victor, aun me sigue mostrando por el id después de agregar el slug
-
Javi hace 2 años
Mira a ver que a la hora de poner la función en el modelo Curso la función se llame getRouteKeyName() y no getKeyName(), que yo las confundí y tardé en darme cuenta.
-
-
Carlos Palenque hace 2 años
Buenas Victor me funciono perfecto las url amigables pero falla cuando se quiere almacenar un nuevo curso.
Saludos cordiales
-
Victor Arana Flores hace 2 años
No necesariamente. Tu puedes ponerle un título super extenso a un artículo de un blog, y quieres que la url sea mucho más concisa.
Todo depende de como quieras manejarlo. -
David Austria hace 2 años
// A mí me funcionó editar App\Models\Curso de la siguiente forma:
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;
class Curso extends Model
{
use HasFactory;
protected $guarded = [];
public function getRouteKeyName(){
return 'slug';
}
public static function boot()
{
parent::boot();
static::saving(function ($model) {
$model->slug = Str::slug($model->name);
});
}
}
-
Ever Pippino hace 2 años
Victor, seria bueno que a ésto último lo aclares en el video, porque es verdad, sino da error al intentar crear un nuevo curso. Gracias! (Gracias David Austria)
-
Oskar Byte hace 1 año
tengo el mismo problema. Aunque inserte el codigo de David me sigue apareciendo el mismo error.
-
Sergio ┏(-_-)┛┗(-_- )┓┗(-_-)┛ hace 1 año
Gracias David, si me permites solo una observación, falto el agregar cuando sean mas de 2 palabras el nombre del curso que el slug generado por el nombre del curso sea separado por “-” guion medio sustituyendo a los espacios entre las palabras:
public static function boot() { parent::boot(); static::saving(function ($model) { $model->slug = Str::slug($model->name, '-'); }); }
Saludos
-