Create permanent seo friendly slugs for every model
You can install the package via composer:
composer require hyperlink/laravel-sluggable
You can publish and run the migrations with:
php artisan vendor:publish --tag="laravel-sluggable-migrations"
php artisan migrate
You can publish the config file with:
php artisan vendor:publish --tag="laravel-sluggable-config"
This is the contents of the published config file:
return [
/*
* The name of the table that will store the slugs.
*/
'table' => 'slugs',
/*
* The name of the column that will store the slug.
*/
'column' => 'slug',
/*
* The separator used to separate words in the slug.
* ATTENTION: If you change this value
* no existing slugs will be changed.
*/
'separator' => '-',
/*
* The separator used to separate the slug from the counter.
* If the slug already exists, a counter will be added.
* ATTENTION: If you change this value
* no existing slugs will be changed.
*/
'counter_separator' => '_',
/*
* The max length of the slug excluding the counter.
* ATTENTION: If you change this value to above 255
* you must also publish the migration and
* change column type in the database.
*/
'max_length' => 255,
/*
* The model that will be used to generate the slug.
* You can use your own model by extending the provided model.
*/
'model' => Hyperlink\Sluggable\Models\Slug::class,
];
class Post extends Model
{
use Sluggable; // Add this trait to your model
// The column that will be used to generate the slug
protected string $slugCreatedFrom = 'title';
}
The trait will register an observer that will generate the slug when the model is created or updated.
public static function bootSluggable(): void
{
// ...
static::created(/* ... */);
static::updated(/* ... */);
// ...
}
You can overwrite it with
protected function makeSlug(): string
{
return (string) sluggable($this->{$this->getSlugCreatedFrom()});
}
composer test
Please review our security policy on how to report security vulnerabilities.
The MIT License (MIT). Please see License File for more information.