aram-zahedi/persian-sluggable

在保存 Eloquent 模型时生成波斯语 slugs

1.8 2020-08-07 12:53 UTC

This package is auto-updated.

Last update: 2024-09-07 22:44:00 UTC


README

Latest Version on Packagist

此包是 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