Este paquete proporciona un rasgo que generará un slug único al guardar cualquier modelo de Eloquent.
$model = new EloquentModel();$model->name = 'activerecord es increíble';$model->save();echo $model->slug; // genera "activerecord-es-impresionante"
Los slugs se generan con el método Str::slug
de Laravels, mediante el cual los espacios se convierten a '-'.
Spatie es una agencia de diseño web con sede en Amberes, Bélgica. Encontrará una descripción general de todos nuestros proyectos de código abierto en nuestro sitio web.
Invertimos muchos recursos en la creación de los mejores paquetes de código abierto. Puedes apoyarnos comprando uno de nuestros productos pagos.
Agradecemos mucho que nos envíe una postal desde su ciudad natal, mencionando cuál de nuestros paquetes está utilizando. Encontrarás nuestra dirección en nuestra página de contacto. Publicamos todas las postales recibidas en nuestro muro virtual de postales.
Puede instalar el paquete a través del compositor:
el compositor requiere spatie/laravel-sluggable
Tus modelos de Eloquent deben usar el rasgo SpatieSluggableHasSlug
y la clase SpatieSluggableSlugOptions
.
El rasgo contiene un método abstracto getSlugOptions()
que debes implementar tú mismo.
Las migraciones de sus modelos deben tener un campo para guardar el slug generado.
Aquí hay un ejemplo de cómo implementar el rasgo:
aplicación de espacio de nombres; use SpatieSluggableHasSlug; use SpatieSluggableSlugOptions; use IlluminateDatabaseEloquentModel; clase YourEloquentModel extiende el modelo {use HasSlug;/** * Obtenga las opciones para generar el slug. */función pública getSlugOptions() : SlugOptions{return SlugOptions::create() ->generarSlugsFrom('nombre') ->saveSlugsTo('babosa'); } }
Con su migración:
use IlluminateDatabaseMigrationsMigration;use IlluminateDatabaseSchemaBlueprint;use IlluminateSupportFacadesSchema;la clase CreateYourEloquentModelTable extiende la migración {función pública activa() { Schema::create('your_eloquent_models', function (Blueprint $table) {$table->increments('id');$table->string('slug'); // Nombre del campo igual que tu `saveSlugsTo`$table ->cadena('nombre');$tabla->marcas de tiempo(); }); } }
Para usar el slug generado en rutas, recuerde usar el enlace del modelo de ruta implícito de Laravel:
aplicación de espacio de nombres; use SpatieSluggableHasSlug; use SpatieSluggableSlugOptions; use IlluminateDatabaseEloquentModel; clase YourEloquentModel extiende el modelo {use HasSlug;/** * Obtenga las opciones para generar el slug. */función pública getSlugOptions() : SlugOptions{return SlugOptions::create() ->generarSlugsFrom('nombre') ->saveSlugsTo('babosa'); }/** * Obtener la clave de ruta para el modelo. * * @return string */función pública getRouteKeyName() {return 'babosa'; } }
¿Quiere utilizar campos múltiples como base para un slug? ¡Ningún problema!
función pública getSlugOptions() : SlugOptions{return SlugOptions::create() ->generarSlugsFrom(['primer_nombre', 'apellido']) ->saveSlugsTo('babosa'); }
También puedes pasar un callable
para generateSlugsFrom
.
De forma predeterminada, el paquete generará slugs únicos agregando '-' y un número a un slug que ya existe.
Puede desactivar este comportamiento llamando allowDuplicateSlugs
.
función pública getSlugOptions() : SlugOptions{return SlugOptions::create() ->generarSlugsFrom('nombre') ->guardarSlugsTo('babosa') ->allowDuplicateSlugs(); }
También puedes poner un límite de tamaño máximo al slug creado:
función pública getSlugOptions() : SlugOptions{return SlugOptions::create() ->generarSlugsFrom('nombre') ->guardarSlugsTo('babosa') ->slugsShouldBeNoLongerThan(50); }
El slug puede ser ligeramente más largo que el valor especificado, debido al sufijo que se agrega para hacerlo único.
También puedes usar un separador personalizado llamando usingSeparator
función pública getSlugOptions() : SlugOptions{return SlugOptions::create() ->generarSlugsFrom('nombre') ->guardarSlugsTo('babosa') ->usandoSeparator('_'); }
Para configurar el idioma utilizado por Str::slug
puedes llamar usingLanguage
función pública getSlugOptions() : SlugOptions{return SlugOptions::create() ->generarSlugsFrom('nombre') ->guardarSlugsTo('babosa') ->usingLanguage('nl'); }
También puede anular el slug generado simplemente configurándolo en un valor diferente al slug generado.
$modelo = EloquentModel::create(['nombre' => 'mi nombre']); //slug ahora es "mi-nombre";$model->slug = 'mi-url-personalizada';$model->save(); //slug ahora es "mi-URL-personalizada";
Si no desea crear el slug cuando el modelo tiene un estado, puede usar la función skipGenerateWhen
.
función pública getSlugOptions() : SlugOptions{return SlugOptions::create() ->generarSlugsFrom('nombre') ->guardarSlugsTo('babosa') ->skipGenerateWhen(fn () => $this->state === 'borrador'); }
Si no desea crear el slug cuando se crea inicialmente el modelo, puede configurar el uso de la función doNotGenerateSlugsOnCreate()
.
función pública getSlugOptions() : SlugOptions{return SlugOptions::create() ->generarSlugsFrom('nombre') ->guardarSlugsTo('babosa') ->doNotGenerateSlugsOnCreate(); }
De manera similar, si desea evitar que el slug se actualice en las actualizaciones del modelo, llame doNotGenerateSlugsOnUpdate()
.
función pública getSlugOptions() : SlugOptions{return SlugOptions::create() ->generarSlugsFrom('nombre') ->guardarSlugsTo('babosa') ->doNotGenerateSlugsOnUpdate(); }
Esto puede ser útil para crear enlaces permanentes que no cambian hasta que usted lo desee explícitamente.
$modelo = EloquentModel::create(['nombre' => 'mi nombre']); //slug ahora es "mi-nombre";$model->save();$model->name = 'nombre cambiado';$model->save(); //slug permanece "mi-nombre"
Si desea actualizar explícitamente el slug en el modelo, puede llamar generateSlug()
en su modelo en cualquier momento para crear el slug de acuerdo con sus otras opciones. No olvide save()
el modelo para conservar la actualización en su base de datos.
Puede evitar que se sobrescriban los slugs.
función pública getSlugOptions() : SlugOptions{return SlugOptions::create() ->generarSlugsFrom('nombre') ->guardarSlugsTo('babosa') ->prevenirOverwrite(); }
Si tiene un alcance global que debe tenerse en cuenta, también puede definirlo con extraScope
. Por ejemplo, si tiene una tabla de páginas que contiene páginas de varios sitios web y cada sitio web tiene sus propios slugs únicos.
función pública getSlugOptions() : SlugOptions{return SlugOptions::create() ->generarSlugsFrom('nombre') ->guardarSlugsTo('babosa') ->extraScope(fn ($builder) => $builder->where('scope_id', $this->scope_id)); }
De forma predeterminada, el índice de sufijos comienza desde 1, puede establecer el número inicial.
función pública getSlugOptions() : SlugOptions{return SlugOptions::create() ->generarSlugsFrom('nombre') ->guardarSlugsTo('babosa') ->startSlugSuffixFrom(2); }
Puede utilizar este paquete junto con laravel-translatable para generar un slug para cada configuración regional. En lugar de usar el rasgo HasSlug
, debe usar el rasgo HasTranslatableSlug
y agregar el nombre del campo slug a la matriz $translatable
. Para los slugs que se generan a partir de uno o varios campos, no es necesario cambiar nada más.
aplicación de espacio de nombres; use SpatieSluggableHasTranslatableSlug; use SpatieSluggableSlugOptions; use SpatieTranslatableHasTranslations; use IlluminateDatabaseEloquentModel; clase YourEloquentModel extiende el modelo {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * Obtenga las opciones para generar el slug. */función pública getSlugOptions() : SlugOptions{return SlugOptions::create() ->generarSlugsFrom('nombre') ->saveSlugsTo('babosa'); } }
Para los slugs que se generan a partir de un invocable, es necesario crear una instancia de SlugOptions
con el método createWithLocales
. El invocable ahora toma dos argumentos en lugar de uno. Tanto el $model
como el $locale
están disponibles para generar un slug.
aplicación de espacio de nombres; use SpatieSluggableHasTranslatableSlug; use SpatieSluggableSlugOptions; use SpatieTranslatableHasTranslations; use IlluminateDatabaseEloquentModel; clase YourEloquentModel extiende el modelo {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * Obtenga las opciones para generar el slug. */función pública getSlugOptions() : SlugOptions{return SlugOptions::createWithLocales(['en', 'nl']) ->generateSlugsFrom(function($modelo, $locale) {return "{$locale} {$model->id}"; }) ->saveSlugsTo('babosa'); } }
También puede utilizar el enlace del modelo de ruta implícito de Laravels dentro de su controlador para resolver automáticamente el modelo. Para utilizar esta función, asegúrese de que la columna slug coincida con routeNameKey
.
Actualmente, sólo algunos tipos de bases de datos admiten operaciones JSON. Puede encontrar más información sobre qué bases de datos admiten JSON en los documentos de Laravel.
aplicación de espacio de nombres; use SpatieSluggableHasSlug; use SpatieSluggableSlugOptions; use IlluminateDatabaseEloquentModel; clase YourEloquentModel extiende el modelo {use HasTranslations, HasTranslatableSlug;public $translatable = ['name', 'slug'];/** * Obtenga las opciones para generar el slug. */función pública getSlugOptions() : SlugOptions{return SlugOptions::create() ->generarSlugsFrom('nombre') ->saveSlugsTo('babosa'); }/** * Obtener la clave de ruta para el modelo. * * @return string */función pública getRouteKeyName() {return 'babosa'; } }
Para mayor comodidad, puede utilizar el alias findBySlug
para recuperar un modelo. La consulta se comparará con el campo pasado a saveSlugsTo
al definir SlugOptions
.
$modelo = Artículo::findBySlug('mi-artículo');
findBySlug
también acepta un segundo parámetro $columns
al igual que el método find
predeterminado de Eloquent.
Consulte CHANGELOG para obtener más información sobre los cambios recientes.
prueba de compositor
Consulte CONTRIBUCIÓN para obtener más detalles.
Si encuentra un error relacionado con la seguridad, envíe un correo electrónico a [email protected] en lugar de utilizar el rastreador de problemas.
Freek Van der Herten
Todos los contribuyentes
La Licencia MIT (MIT). Consulte el archivo de licencia para obtener más información.