taylornetwork/model-slugger

There is no license information available for the latest version (1.0.1) of this package.

Automatically add slugs to eloquent models

1.0.1 2018-04-22 13:11 UTC

This package is auto-updated.

Last update: 2024-10-24 11:43:57 UTC


README

Install

Using Composer

$ composer require taylornetwork/model-slugger

Usage

In a class that extends Illuminate\Database\Eloquent\Model add the TaylorNetwork\ModelSlugger\ModelSlugger trait.

This will require you to define the sluggerConfig() function which returns an array with minimum options being ['source' => 'model field to make slug from']

// app/ExampleModel.php

namespace App;

use Illuminate\Database\Eloquent\Model;
use TaylorNetwork\ModelSlugger\ModelSlugger;

class ExampleModel extends Model
{
	use ModelSlugger;

	public function sluggerConfig()
	{
		return [ 
			'source' => 'name',
		];
	}
}

Where name would be converted to a slug and placed into the column slug by default

Bind slug to route

You can bind the routes in your application to the slug rather than ID by adding

protected $sluggerRouteModelBind = true;

To your model, it will cause the routes to be looked up using the slug column.

Unique

To make all slugs unique add 'unique' => 'all' to the config array either in the model or in config/slugger.php

// app/ExampleModel.php

public function sluggerConfig()
{
  return [
    'source' => 'name',
    'unique' => 'all',
  ];
}

Unique to a Parent

If you want slugs to only be unique based on a parent class, add 'unique' => 'parent', 'parent' => 'App\ParentClassName' to the model or config/slugger.php

For example you have a App\User model and a App\TodoList model where the a user can have many todo lists each with slugs. If we set the config to unique => all and every user makes a todo list named 'my todo list' the slugs will become increasingly long as they become unique.

To avoid this you can make the slugs unique if they are from the same parent.

// app/TodoList.php

public function sluggerConfig()
{
  return [
    'source' => 'name',
    'unique' => 'parent',
    'parent' => 'App\User',
  ];
}

Slugger Route Model Bind with Unique to a Parent

To accomplish route model binding you will need to add the code to find only slugs with the correct parent to your App\Providers\RouteServiceProvider class

For example

public function boot()
{
    Route::bind('user', function ($value) {
        return App\User::findOrFail($value); // Code to find by ID or slug
    });

    Route::bind('todoList', function ($slug, $route) {
        // $route->parameter('user') will return an instance of App\User 
        return $route->parameter('user')->todoLists()->where('slug', $slug)->firstOrFail(); 
    });

    parent::boot();
}

Credits

License

The MIT License (MIT). Please see License File for more information.