taylornetwork / model-slugger
自动为eloquent模型添加slug
Requires
- php: >=5.4.0
- cocur/slugify: ^2.3
- illuminate/support: 5.*.*
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(); }
致谢
- 主要作者:Sam Taylor
许可
MIT许可(MIT)。请参阅许可文件获取更多信息。