oddvalue/laravel-sluggable

在保存Eloquent模型时生成短链接

2.6.0 2020-10-28 12:03 UTC

README

是从https://github.com/spatie/laravel-sluggable分叉出来的,以支持在L8上使用PHP 7.3,除非你需要使用原始包

在保存Eloquent模型时生成短链接

Latest Version on Packagist MIT Licensed Build Status Quality Score StyleCI Total Downloads

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

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

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

短链接通过Laravel的Str::slug方法生成,其中空格被转换为'-'。

安装

您可以通过composer安装此包

composer require spatie/laravel-sluggable

使用方法

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

特性包含一个必须由您自己实现的方法getSlugOptions()

您的模型迁移应该有一个字段来保存生成的短链接。

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

<?php

namespace App;

use Oddvalue\Sluggable\HasSlug;
use Oddvalue\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'); // Field name same as your `saveSlugsTo`
            $table->string('name');
            $table->timestamps();
        });
    }
}

要在路由中使用生成的短链接,请记住使用Laravel的隐式路由模型绑定

namespace App;

use Oddvalue\Sluggable\HasSlug;
use Oddvalue\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";

如果您不希望在模型最初创建时创建短链接,可以设置使用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()模型以将更新持久化到数据库。

变更日志

请参阅CHANGELOG了解最近更改的详细信息。

测试

composer test

贡献

请参阅CONTRIBUTING以获取详细信息。

安全

如果您发现任何安全相关的问题,请通过freek@spatie.be发送电子邮件,而不是使用问题跟踪器。

Postcardware

您可以使用此包,但如果它进入您的生产环境,我们非常感谢您从家乡寄给我们一张明信片,说明您正在使用我们的哪个包。

我们的地址是:Oddvalue,Samberstraat 69D,2060 安特卫普,比利时。

我们将所有收到的明信片发布在我们的公司网站上

致谢

支持我们

Oddvalue是一家位于比利时安特卫普的网页设计公司。您可以在我们的网站上找到所有开源项目的概述(点击此处查看)

您的业务是否依赖于我们的贡献?请通过Patreon联系我们并支持我们。所有承诺都将用于分配人力进行维护和开发新的酷炫功能。

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件