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

    Elis Morán hace 5 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

    Jordi Fernandez hace 9 meses

    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 9 meses

      Seguramente no tienes el nombre de campo que has pedido usar.

  • Martzdev

    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

    Bruno Decruz hace 1 año

    un grande

  • Javi

    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

    Walter hace 1 año

    ? 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 8 meses

      Ya no están los comentarios, es una pena quería guiarme para mis errores. :(

  • Ruben

    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

    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

    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 1 año

      // 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 1 año

      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 S. S. ┏(-_-)┛┗(-_- )┓┗(-_-)┛ hace 9 meses

      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