tustin / laravel-sluggable
保存Eloquent模型时生成别名
Requires
- php: ^8.0
- illuminate/database: ^8.0|^9.0
- illuminate/support: ^8.0|^9.0
Requires (Dev)
- orchestra/testbench: ^6.23|^7.0
- pestphp/pest: ^1.20
- spatie/laravel-translatable: ^5.0|^6.0
- dev-main
- 3.4.0
- 3.3.1
- 3.3.0
- 3.2.0
- 3.1.1
- 3.1.0
- 3.0.2
- 3.0.1
- 3.0.0
- 2.6.2
- 2.6.1
- 2.6.0
- 2.5.2
- 2.5.1
- 2.5.0
- 2.4.2
- 2.4.1
- 2.4.0
- 2.3.0
- 2.2.x-dev
- 2.2.3
- 2.2.2
- 2.2.1
- 2.2.0
- 2.1.8
- 2.1.7
- 2.1.6
- 2.1.5
- 2.1.4
- 2.1.3
- 2.1.2
- 2.1.1
- 2.1.0
- 2.0.0
- v1.x-dev
- 1.5.2
- 1.5.1
- 1.5.0
- 1.4.1
- 1.4.0
- 1.3.0
- 1.2.0
- 1.1.0
- 1.0.2
- 1.0.1
- 1.0.0
- 0.0.1
- dev-phpunit-8
- dev-laravel-5.8
This package is auto-updated.
Last update: 2024-09-21 22:41:38 UTC
README
保存Eloquent模型时生成别名
此包提供了一个特性,当保存任何Eloquent模型时,将生成一个唯一的别名。
$model = new EloquentModel(); $model->name = 'activerecord is awesome'; $model->save(); echo $model->slug; // outputs "activerecord-is-awesome"
别名通过Laravel的Str::slug
方法生成,其中空格被转换为'-'。
Spatie是一家位于比利时安特卫普的网页设计公司。您可以在我们的网站上找到我们所有开源项目的概述在此。
支持我们
我们投入了大量资源来创建最好的开源包。您可以通过购买我们的付费产品之一来支持我们。
我们非常感谢您从您的家乡寄给我们一张明信片,注明您正在使用我们的哪个包。您可以在我们的联系页面上找到我们的地址。我们将在我们的虚拟明信片墙上发布所有收到的明信片。
安装
您可以通过composer安装此包
composer require spatie/laravel-sluggable
使用方法
您的Eloquent模型应使用Spatie\Sluggable\HasSlug
特性和Spatie\Sluggable\SlugOptions
类。
该特性包含一个抽象方法getSlugOptions()
,您必须自行实现。
您的模型迁移应该有一个字段来保存生成的别名。
以下是实现此特性的示例
namespace App; use Spatie\Sluggable\HasSlug; use Spatie\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'); } }
及其迁移
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateYourEloquentModelTable extends Migration { public function up() { Schema::create('your_eloquent_models', function (Blueprint $table) { $table->increments('id'); $table->string('slug'); // Field name same as your `saveSlugsTo` $table->string('name'); $table->timestamps(); }); } }
在路由中使用别名
要使用生成的别名在路由中,请记住使用Laravel的隐式路由模型绑定
namespace App; use Spatie\Sluggable\HasSlug; use Spatie\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'); } /** * Get the route key for the model. * * @return string */ public function getRouteKeyName() { return 'slug'; } }
使用多个字段创建别名
想要使用多个字段作为别名的依据?没问题!
public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom(['first_name', 'last_name']) ->saveSlugsTo('slug'); }
自定义别名生成
您还可以将一个callable
传递给generateSlugsFrom
。
默认情况下,该包将通过追加'-'和数字到已存在的别名来生成唯一的别名。
您可以通过调用allowDuplicateSlugs
来禁用此行为。
public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->allowDuplicateSlugs(); }
限制别名的长度
您还可以对创建的别名设置最大大小限制
public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->slugsShouldBeNoLongerThan(50); }
由于添加了后缀以使其唯一,别名可能比指定的值略长。
您还可以通过调用usingSeparator
使用自定义分隔符
public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->usingSeparator('_'); }
设置别名语言
要设置Str::slug
使用的语言,您可以调用usingLanguage
public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->usingLanguage('nl'); }
覆盖别名
您还可以通过将其设置为与生成的别名不同的值来覆盖生成的别名。
$model = EloquentModel::create(['name' => 'my name']); //slug is now "my-name"; $model->slug = 'my-custom-url'; $model->save(); //slug is now "my-custom-url";
在某些条件下防止生成别名
如果您不希望在模型处于某种状态时创建别名,您可以使用skipGenerateWhen
函数。
public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->skipGenerateWhen(fn () => $this->state === 'draft'); }
防止在创建时生成别名
如果您不希望在模型最初创建时创建别名,您可以使用doNotGenerateSlugsOnCreate()
函数。
public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->doNotGenerateSlugsOnCreate(); }
防止更新别名
类似地,如果您想要防止在模型更新时更新别名,请调用doNotGenerateSlugsOnUpdate()
。
public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->doNotGenerateSlugsOnUpdate(); }
这可以帮助创建不会改变直到您明确想要改变它的永久链接。
$model = EloquentModel::create(['name' => 'my name']); //slug is now "my-name"; $model->save(); $model->name = 'changed name'; $model->save(); //slug stays "my-name"
重新生成别名
如果您想显式更新模型上的别名,可以在任何时候在您的模型上调用generateSlug()
来根据您其他选项生成别名。不要忘记调用save()
模型以将更新持久化到数据库。
防止覆盖
您可以防止slug被覆盖。
public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->preventOverwrite(); }
使用作用域
如果您有一个需要考虑的全局作用域,您也可以使用extraScope
来定义它。例如,如果您有一个包含多个网站页面的pages表,并且每个网站都有自己的唯一slug。
public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->extraScope(fn ($builder) => $builder->where('scope_id', $this->scope_id)); }
与laravel-translatable集成
您可以使用这个包与laravel-translatable一起使用,为每个区域生成slug。您必须使用HasTranslatableSlug
特质,而不是使用HasSlug
特质,并将slug字段的名称添加到$translatable
数组中。对于从单个字段或多个字段生成的slug,您不需要更改其他内容。
namespace App; use Spatie\Sluggable\HasTranslatableSlug; use Spatie\Sluggable\SlugOptions; use Spatie\Translatable\HasTranslations; use Illuminate\Database\Eloquent\Model; class YourEloquentModel extends Model { use HasTranslations, HasTranslatableSlug; public $translatable = ['name', 'slug']; /** * Get the options for generating the slug. */ public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug'); } }
对于从可调用生成的slug,您需要使用createWithLocales
方法实例化SlugOptions
。现在可调用函数接受两个参数而不是一个。现在可以通过$model
和$locale
来生成slug。
namespace App; use Spatie\Sluggable\HasTranslatableSlug; use Spatie\Sluggable\SlugOptions; use Spatie\Translatable\HasTranslations; use Illuminate\Database\Eloquent\Model; class YourEloquentModel extends Model { use HasTranslations, HasTranslatableSlug; public $translatable = ['name', 'slug']; /** * Get the options for generating the slug. */ public function getSlugOptions() : SlugOptions { return SlugOptions::createWithLocales(['en', 'nl']) ->generateSlugsFrom(function($model, $locale) { return "{$locale} {$model->id}"; }) ->saveSlugsTo('slug'); } }
隐式路由模型绑定
您还可以在控制器中使用Laravel的隐式路由模型绑定来自动解析模型。要使用此功能,请确保slug列与routeNameKey
匹配。
目前,只有某些数据库类型支持JSON操作。有关哪些数据库支持JSON的更多信息,请参阅Laravel文档。
namespace App; use Spatie\Sluggable\HasSlug; use Spatie\Sluggable\SlugOptions; use Illuminate\Database\Eloquent\Model; class YourEloquentModel extends Model { use HasTranslations, HasTranslatableSlug; public $translatable = ['name', 'slug']; /** * Get the options for generating the slug. */ public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug'); } /** * Get the route key for the model. * * @return string */ public function getRouteKeyName() { return 'slug'; } }
变更日志
请参阅CHANGELOG以获取最近更改的更多信息。
测试
composer test
贡献
请参阅CONTRIBUTING以获取详细信息。
安全
如果您发现有关安全性的bug,请通过邮件security@spatie.be联系,而不是使用问题跟踪器。
鸣谢
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。