padsoft/laravel-sluggable

保存 Eloquent 模型时生成 slugs

3.7.0 2024-05-20 12:08 UTC

This package is auto-updated.

Last update: 2024-09-20 12:49:20 UTC


README

Latest Version on Packagist Software License Build Status Quality Score Total Downloads SensioLabsInsight

此包提供了一个特性,用于在保存任何 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)。有关更多信息,请参阅许可证文件