amidesfahani/laravel-sku

为 Eloquent 模型生成 SKUs

dev-main 2021-10-14 08:32 UTC

This package is auto-updated.

Last update: 2024-09-14 14:40:01 UTC


README

在保存任何 Eloquent 模型时生成唯一的 SKUs,支持 Laravel 5.6、Laravel 6 及以上版本。

$model = new EloquentModel();
$model->name = 'Laravel is Awesome';
$model->save();

echo $model->sku; // ouputs "LAR-80564492"

该包将为 Laravel 的 Illuminate\Support\Str::sku() 类添加一个新方法来为您生成 SKU。

安装

您可以通过 composer 安装此包

composer require amidesfahani/laravel-sku

服务提供者将自动注册自身。

您可以使用以下命令发布配置文件:

php artisan vendor:publish --provider="Amid\Sku\SkuServiceProvider" --tag="config"

以下是将在 config/laravel-sku.php 中发布的配置文件内容:

return [

    /*
    |--------------------------------------------------------------------------
    | SKU settings
    |--------------------------------------------------------------------------
    |
    | Set up your SKU
    |
    */
    'default' => [
        /*
         * SKU is based on a specific field of a model
         * You can use a single field or an array of fields or string
         */
        'source' => 'name',

        /*
         * Destination model field name
         *
         */
        'field' => 'sku',

        /*
         * SKU separator
         *
         */
        'separator' => '-',

        /*
         * Shall SKUs be enforced to be unique
         *
         */
        'unique' => true,

        /*
         * Shall SKUs be generated on create
         *
         */
        'generate_on_create' => true,

        /*
         * Shall SKUs be re-generated on update
         *
         */
        'generate_on_update' => true,
    ],

    /*
    |--------------------------------------------------------------------------
    | SKU Generator
    |--------------------------------------------------------------------------
    |
    | Define your own generator if needed.
    |
    */
    'generator' => \Amid\Sku\Concerns\SkuGenerator::class,
];

请注意,上述设置假定您在模型中有一个 sku 字段。如果您计划手动覆盖值,请确保将此字段添加到 fillable 数组中;

使用方法

Amid\Sku\HasSku 特性添加到您的模型中。就是这样!

namespace App;

use Amid\Sku\HasSku;
use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    use HasSku;
}

幕后,这将注册一个观察器来监听 sku 字段,每次保存模型时都会生成 SKU。

高级使用

如果您想为特定模型更改设置,可以重载 skuOptions() 方法

namespace App;

use Amid\Sku\HasSku;
use Amid\Sku\Concerns\SkuOptions;
use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    use HasSku;

    /**
     * Get the options for generating the Sku.
     *
     * @return Amid\Sku\SkuOptions
     */
    public function skuOptions() : SkuOptions
    {
        return SkuOptions::make()
            ->from(['label', 'another_field'])
            ->target('arbitrary_sku_field_name')
            ->using('_')
            ->forceUnique(false)
            ->generateOnCreate(true)
            ->refreshOnUpdate(false);
    }
}

自定义生成器

假设您需要一些额外的逻辑,例如设置默认值或为 SKU 定义前缀,您可以实现自己的 SkuGenerator。最简单的方法是扩展基类,但您也可以自由探索任何其他方法。

首先,创建一个自定义类

namespace App\Components\SkuGenerator;

use Amid\Sku\Concerns\SkuGenerator;

class CustomSkuGenerator extends SkuGenerator
{
    /**
     * Get the source fields for the SKU.
     *
     * @return string
     */
    protected function getSourceString(): string
    {
        // fetch the source fields
        $source = $this->options->source;
        // Fetch fields from model, skip empty
        $fields = array_filter($this->model->only($source));
        // Fetch fields from the model, if empty, use custom logic to resolve
        if (empty($fields)) {
            return 'some-random-value-logic';
        }
        // Impode with a separator
        return implode($this->options->separator, $fields);
    }
}

然后更新 generator 配置值

    'generator' => \App\Components\SkuGenerator\CustomSkuGenerator::class,

您也可以选择完全更改实现;只需记住,自定义生成器必须实现 Amid\Sku\Contracts\SkuGenerator

关于 SKUs

库存单位(SKU) 允许您设置一个唯一的标识符或代码,该代码引用特定的库存单位。

变更日志

有关最近更改的更多信息,请参阅 变更日志

测试

composer test

鸣谢(原始包)

许可证

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