edofre/laravel-sluggable

在保存 Eloquent 模型时生成 slugs

V1.5.2 2017-03-24 08:35 UTC

README

Code Climate Latest Stable Version Latest Unstable Version License

此包提供了一个特质,用于在保存任何 Eloquent 模型时生成唯一的 slug。

$model = new EloquentModel();
$model->name = 'activerecord is awesome';
$model->save();

echo $model->slug; // ouputs "activerecord-is-awesome"

slug 通过 Laravel 的 str_slug 方法生成,其中空格被转换为 '-'。

安装

您可以通过 composer 安装此包

$ composer require edofre/laravel-sluggable

用法

您的 Eloquent 模型应使用 Edofre\Sluggable\HasSlug 特质和 Edofre\Sluggable\SlugOptions 类。

特质包含一个抽象方法 getSlugOptions(),您必须自行实现。

以下是如何实现该特质的示例

<?php

namespace App;

use Edofre\Sluggable\HasSlug;
use Edofre\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('url');
    }
}

想要使用多个字段作为 slug 的基础?没问题!

public function getSlugOptions() : SlugOptions
{
    return SlugOptions::create()
        ->generateSlugsFrom(['first_name', 'last_name'])
        ->saveSlugsTo('url');
}

您还可以将一个 callable 传递给 generateSlugsFrom

默认情况下,该包将通过在已存在的 slug 后追加 '-' 和一个数字来生成唯一的 slugs。

您可以通过调用 allowDuplicateSlugs 来禁用此行为。

public function getSlugOptions() : SlugOptions
{
    return SlugOptions::create()
        ->generateSlugsFrom('name')
        ->saveSlugsTo('url')
        ->allowDuplicateSlugs();
}

您还可以对创建的 slug 设置最大长度限制

public function getSlugOptions() : SlugOptions
{
    return SlugOptions::create()
        ->generateSlugsFrom('name')
        ->saveSlugsTo('url')
        ->slugsShouldBeNoLongerThan(50);
}

由于添加了使它唯一的后缀,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"

如果您不希望在模型最初创建时创建 slug,可以使用 `doNotGenerateSlugsOnCreate()` 函数。

public function getSlugOptions() : SlugOptions
{
    return SlugOptions::create()
        ->generateSlugsFrom('name')
        ->saveSlugsTo('url')
        ->doNotGenerateSlugsOnCreate();
}

类似地,如果您想防止在模型更新时更新 slug,请调用 doNotGenerateSlugsOnUpdate()。这可以帮助创建直到您明确想要改变才改变的重定向链接。

public function getSlugOptions() : SlugOptions
{
    return SlugOptions::create()
        ->generateSlugsFrom('name')
        ->saveSlugsTo('url')
        ->doNotGenerateSlugsOnUpdate();
}

如果您想显式更新模型上的 slug,可以在任何时间调用您的模型上的 generateSlug() 来根据您其他选项生成 slug。别忘了调用 save() 来将更新持久化到您的数据库。

变更日志

请参阅 CHANGELOG 以获取有关最近更改的更多信息。

测试

$ composer test

致谢

这是一个从 https://github.com/spatie/laravel-sluggable 分支出来的项目,我只是将其转换为与 php 5.6 兼容。

Spatie 是一家位于比利时安特卫普的网页设计公司。您可以在我们的网站上找到所有开源项目的概述 在这里

许可证

MIT 许可证 (MIT)。请参阅 许可证文件 以获取更多信息。