taylornetwork/model-slugger

该软件包最新版本(1.0.1)没有可用的许可信息。

自动为eloquent模型添加slug

1.0.1 2018-04-22 13:11 UTC

This package is auto-updated.

Last update: 2024-09-24 11:30:42 UTC


README

安装

使用Composer

$ composer require taylornetwork/model-slugger

用法

在一个扩展Illuminate\Database\Eloquent\Model的类中添加TaylorNetwork\ModelSlugger\ModelSlugger特性。

这需要你定义sluggerConfig()函数,该函数返回一个数组,最小选项是['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',
		];
	}
}

其中name将被转换为slug,并默认放置到slug列中

将slug绑定到路由

你可以通过添加以下代码到你的模型来将应用程序中的路由绑定到slug而不是ID:

protected $sluggerRouteModelBind = true;

这将导致路由使用slug列进行查找。

唯一性

要使所有slug唯一,请在模型或config/slugger.php中将config数组中的'unique' => 'all'添加到模型或config/slugger.php

// app/ExampleModel.php

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

唯一性至父级

如果你想使slug只基于父级类唯一,请在模型或config/slugger.php中将'unique' => 'parent', 'parent' => 'App\ParentClassName'添加到模型或config/slugger.php

例如,你有App\User模型和App\TodoList模型,其中用户可以有多个待办事项列表,每个列表都有自己的slug。如果我们设置配置为unique => all并且每个用户都创建一个名为'my todo list'的待办事项列表,那么随着它们变得唯一,slug会变得越来越长。

为了避免这种情况,你可以使来自同一父级的slug唯一。

// app/TodoList.php

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

具有唯一父级的slugger路由模型绑定

要完成路由模型绑定,你需要将找到正确父级的slug的代码添加到你的App\Providers\RouteServiceProvider类中

例如

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();
}

致谢

许可

MIT许可(MIT)。请参阅许可文件获取更多信息。