padsoft / laravel-sluggable
保存 Eloquent 模型时生成 slugs
Requires
- php: >=7.0.0
- illuminate/database: ^5.7|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
- illuminate/support: ^5.7|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- orchestra/testbench: ^3.7|^4.0|^5.0|^6.0|^7.0|^8.0|^9.0
- phpunit/phpunit: ^7.0|^8.0|^9.0|^10.0
- roave/security-advisories: dev-latest
README
此包提供了一个特性,用于在保存任何 Eloquent 模型时生成唯一的 slug。
注意:此包基于 spatie/laravel-sluggable,但进行了少量调整和改进。以下是主要变化:
- 添加了通过点表示法指定模型关系中的源字段的功能。例如:['category.name'] 或 ['customer.country.code'],其中 category、customer 和 country 是模型关系。
- 添加了指定多个字段并按优先级查找第一个非空源字段的能力。例如:在上面的例子中,我们设置了查找非空源以生成 slug 的顺序:标题、名字和姓氏。注意:如果这些字段中至少有一个不为空,则设置 slug。
SlugOptions::create()->generateSlugsFrom([ 'title', ['first_name', 'last_name'], ])
- 添加了当源字段全部为空时的行为选项(抛出异常或生成随机 slug)。
- 移除了抽象函数 getSlugOptions() 并引入了通过默认选项以零配置设置特性的能力。在模型中定义 getSlugOptions() 函数的能力仍然存在。
- 添加了设置 slug 分隔符的选项
- 其他一些调整和修复
##概述
$model = new EloquentModel(); $model->name = 'activerecord is awesome'; $model->save(); echo $model->slug; // outputs "activerecord-is-awesome"
使用 Laravel 的 str_slug
方法生成 slugs,其中空格被转换为 '-'。
##需求
- php: >=7.0.0
- illuminate/database: ^5.0
- illuminate/support: ^5.0
安装
您可以通过 composer 安装此包
$ composer require padosoft/laravel-sluggable
用法
您的 Eloquent 模型应使用 Padosoft\Sluggable\HasSlug
特性和 Padosoft\Sluggable\SlugOptions
类。
如果您的模型包含 slug 属性并在 getSlugOptionsDefault() 中指定的字段之一,则特性会附带零配置。如果零配置不适合您,您可以在模型中定义 getSlugOptions()
方法。
以下是实现零配置特性的示例
<?php namespace App; use Padosoft\Sluggable\HasSlug; use Illuminate\Database\Eloquent\Model; class YourEloquentModel extends Model { use HasSlug; }
以下是实现带有 getSlugOptions() 实现特性的示例
<?php namespace App; use Padosoft\Sluggable\HasSlug; use Padosoft\Sluggable\SlugOptions; use Illuminate\Database\Eloquent\Model; class YourEloquentModel extends Model { use HasSlug; /** * Get the options for generating the slug. */ public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug'); } }
想要使用多个字段作为 slug 的基础?没问题!
public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom(['first_name', 'last_name']) ->saveSlugsTo('slug'); }
想要使用关系字段作为 slug 的基础?没问题!
public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom('category.name') ->saveSlugsTo('slug'); }
其中 category 是您模型中的关系
public function category() { return $this->belongsTo('\App\Category', 'category_id'); }
如果您想要使用特定的语言创建 slug
public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->slugifyUseLanguage('jp') ->saveSlugsTo('slug'); }
如果您想要使用特定的转换字典
public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->slugifyUseDictionary(['@'=>'at','['=>'quad']) ->saveSlugsTo('slug'); }
它支持关系链,因此您也可以传递一个 customer...
您也可以将 callable
传递给 generateSlugsFrom
。
默认情况下,包将通过追加 '-' 和数字来生成唯一的 slugs,附加到已存在的 slug 上。您可以通过调用 allowDuplicateSlugs
来禁用此行为。
默认情况下,如果所有源字段都为空,包将生成一个 50 个字符的随机 slug。您可以通过调用 disallowSlugIfAllSourceFieldsEmpty
和调用 randomSlugsShouldBeNoLongerThan
来禁用此行为,并设置随机字符串的字符长度。
public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('url') ->allowDuplicateSlugs() ->disallowSlugIfAllSourceFieldsEmpty() ; }
您还可以对创建的 slug 和/或随机 slug 的长度设置最大值限制
public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('url') ->slugsShouldBeNoLongerThan(50) ->randomSlugsShouldBeNoLongerThan(20); }
由于添加了使它唯一的后缀,slug 可能会比指定的值稍长。
您也可以通过将其设置为另一个值来覆盖生成的 slug。
$model = EloquentModel:create(['name' => 'my name']); //url is now "my-name"; $model->url = 'my-custom-url'; $model-save(); $model->name = 'changed name'; $model->save(); //url stays "my name" //if you reset the slug and recall save it will regenerate the slug. $model->url = ''; $model-save(); //url is now "changed-name";
自定义 slug(即手动设置 slug url)
如果您想手动编写自定义 slug,请使用 saveCustomSlugsTo
方法来设置自定义字段
->saveCustomSlugsTo('url-custom')
然后,如果您在模型中设置了 url-custom
属性,则缩略字段将被设置为相同的值。在任何情况下,都会对自定义缩略值进行检查,以确保正确的URL和唯一性。示例
$model = new class extends TestModel { public function getSlugOptions(): SlugOptions { return parent::getSlugOptions()->generateSlugsFrom('name') ->saveCustomSlugsTo('url_custom'); } }; $model->name = 'hello dad'; $model->url_custom = 'this is a custom test'; $model->save(); //the slug is 'this-is-a-custom-test' and not , 'hello-dad';
可缩写作用域助手
该包包含一些用于处理模型及其缩略字的辅助函数。您可以执行以下操作
$post = Post::whereSlug($slugString)->get(); $post = Post::findBySlug($slugString); $post = Post::findBySlugOrFail($slugString);
变更日志
请参阅变更日志获取有关最近更改的更多信息。
测试
$ composer test
贡献
请参阅贡献指南获取详细信息。
安全性
如果您发现任何安全相关的问题,请通过电子邮件而不是使用问题跟踪器。
鸣谢
关于Padosoft
Padosoft(https://www.padosoft.com)是一家位于意大利佛罗伦萨的软件公司。专注于电子商务和网站。
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。