laraeast/laravel-sluggable

Easy creation of slugs for your Eloquent models in Laravel

v2.2.0 2021-06-18 07:18 UTC

This package is auto-updated.

Last update: 2024-04-18 13:43:57 UTC


README

StyleCI Travis Build Status Circleci Build Status Total Downloads Latest Stable Version License

Easy creation of slugs for your Eloquent models in Laravel.

Background: What is a slug?

A slug is a simplified version of a string, typically URL-friendly. The act of "slugging" a string usually involves converting it to one case, and removing any non-URL-friendly characters (spaces, accented letters, ampersands, etc.). The resulting string can then be used as an identifier for a particular resource.

For example, if you have a blog with posts, you could refer to each post via the ID:

http://example.com/post/1
http://example.com/post/2

... but that's not particularly friendly (especially for SEO). You probably would prefer to use the post's title in the URL, if your post is titled "My Dinner With Ahmed & Omar", the URL will be:

http://example.com/post/1-my-dinner-with-ahmed-omar

Installation

  • Install the package via Composer:

    • For Laravel 5.2 >= 6.x
      $ composer require laraeast/laravel-sluggable:^1.0
    • For Laravel 7.x
      $ composer require laraeast/laravel-sluggable:^2.0

    The package will automatically register its service provider.

Middleware

You should add SluggableRedirectMiddleware to web middileware to redirect to latest updated slug. app/Http/Kernel.php file :

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            ...
            \Laraeast\LaravelSluggable\SluggableRedirectMiddleware::class,
        ],
        ...
    ];

Updating your Eloquent Models

Your models should use the Sluggable trait, which has an abstract method sluggableFields() that you need to define. This is where any model-specific configuration is set

use Laraeast\LaravelSluggable\Sluggable;

class Post extends Model
{
    use Sluggable;

    /**
     * The sluggable fields for model.
     *
     * @return array
     */
    public function sluggableFields()
    {
        return ['name'];
    }
}