aram-zahedi / persian-sluggable
在保存 Eloquent 模型时生成波斯语 slugs
1.8
2020-08-07 12:53 UTC
Requires
- php: ^7.2.5
- ext-ctype: *
- ext-mbstring: *
- illuminate/database: ^5.8|^6.0|^7.0
README
此包是 Spatie\Sluggable 的波斯语本地化版本。
包介绍
使用此包,您可以为 Laravel 中的模型自动生成 slugs。支持的 Laravel 版本: 5.8、6 和 7
以下是一个示例
$model = new EloquentModel(); $model->name = 'سلام دنیا'; $model->save(); echo $model->slug; // "سلام-دنیا"
slug 由包内的 Slug 类生成,将文本中的所有空格转换为破折号 -。
安装包
使用以下 Composer 命令安装包。composer require aram-zahedi/persian-sluggable
用法
您的模型应使用名为 AramZahedi\Sluggable\HasSlug 的 trait,并根据需要定义以下函数。您的迁移文件也应该有一个用于存储 slug 的列。例如
<?php namespace App; use AramZahedi\Sluggable\HasSlug; use AramZahedi\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 { /** * Run the migrations. * * @return void */ public function up() { Schema::create('your_eloquent_models', function (Blueprint $table) { $table->increments('id'); $table->string('slug'); // اسم ستونی که نامک در آن ذخیره میشود $table->string('name'); $table->timestamps(); }); } }
您还可以将模型的主键名称更改为以下形式。
namespace App; use AramZahedi\Sluggable\HasSlug; use AramZahedi\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'; // کلید جدید برای router } }
如果想要从两个不同的列组合生成名称,请按以下方式操作。
public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom(['first_name', 'last_name']) //تولید نامک از ترکیب دو ستون نام و نام خانوادگی ->saveSlugsTo('slug'); }
默认情况下,生成的名称是唯一的,不允许重复的 slug。如果您想允许重复的 slug,您需要添加以下 getSlugOptions 方法。
->allowDuplicateSlugs()
如下所示
public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->allowDuplicateSlugs(); }
您还可以使用以下函数设置 slug 的最大长度
->slugsShouldBeNoLongerThan()
如下所示
public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->slugsShouldBeNoLongerThan(50); }
请注意,由于添加了数字后缀以确保唯一性,某些 slug 的长度可能会略微超过设定的长度。
您还可以通过以下函数使用您想要的分隔符,而不是破折号
->usingSeparator(".")
如下所示
public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->usingSeparator('.'); }
创建模型后,slug 将自动生成,也可以手动更改 slug。
$model = EloquentModel:create(['name' => 'hello world']); // نامک hello-world $model->slug = 'my-custom-url'; $model->save(); //نامک جدید "my-custom-url";
如果您希望在创建新模型时 不自动生成 slug,可以调用以下函数
->doNotGenerateSlugsOnCreate()
如下所示
public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->doNotGenerateSlugsOnCreate(); }
每次更改(您指定的)名称时,在保存模型后,slug 也会自动根据新的值重新生成。如果您想在更改选定列的值后 不自动生成 slug,请调用以下函数
->doNotGenerateSlugsOnUpdate()
如下所示
public function getSlugOptions() : SlugOptions { return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug') ->doNotGenerateSlugsOnUpdate(); }
这在需要根据 slug 生成网站页面链接时很有用,因为这些链接不应更改,以免影响 Google 等。
$model = EloquentModel:create(['name' => 'my name']); //نامک "my-name"; $model->save(); $model->name = 'new name'; $model->save(); //نامک مثل قبل "my-name"
如果您想要手动重新生成基于选定列的 slug,可以在模型上调用以下函数
->generateSlug()
在这种情况下,请务必调用 save 函数来保存您的模型。
$model = EloquentModel:create(['name' => 'my name']); //نامک "my-name"; $model->save(); $model->name = 'new name'; $model->save(); //نامک مثل قبل "my-name" $model->generateSlug(); $model->save();//نامک اکنون "new-name"
包测试
composer test
安全
如果出现任何问题,可以通过以下电子邮件地址与我们联系aram1376@yahoo.com