luttje/laravel-user-custom-id

允许用户配置ID样式,然后在您的应用程序中使用该ID样式。

0.2.0 2023-12-30 09:02 UTC

This package is auto-updated.

Last update: 2024-09-08 19:51:57 UTC


README

这个Laravel包允许用户在您的应用程序中创建和使用自定义ID样式。例如,像Jane这样的用户可以为产品ID设置一个格式,如product-{attribute-owner:name}-{random:5}-{increment}。一旦配置完成,应用程序就可以为Jane的产品生成ID,例如第一个产品的ID为product-Jane-z4AyW-1,第二个产品的ID为product-Jane-3QJ5A-2等。

run-tests Coverage Status

警告

此包仍在开发中。它尚未准备好用于生产,API可能在任何时候更改。

安装

您可以通过composer安装此包

composer require luttje/laravel-user-custom-id

👨‍🔧 使用方法

场景

想象一个拥有多个商店的网店系统。用户需要可定制的产品ID。例如

  • 用户A喜欢像123124125这样的顺序号。
  • 用户B选择带有前缀的数字,如A-123A-124
  • 用户Jane喜欢像product-Jane-z4AyW-1product-Jane-3QJ5A-2这样的复杂格式。

此包允许用户定义自己的ID样式。然后,应用程序可以根据他们选择的样式为他们生成产品ID。

配置

用户在创建商店时为模型定义其ID样式。他们选择要自定义ID样式的模型(例如,Product)并输入他们希望使用的样式(例如,product-{attribute-owner:name}-{random:5}-{increment})。配置如下创建

$user = auth()->user();

UserCustomId::createFormat(
    Product::class,
    $user,
    'product-{attribute-owner:name}-{random:5}-{increment}',
    'custom_id'
);

此设置需要目标模型(例如,Product)、用户、ID样式以及存储ID的属性(custom_id)。每当创建属于用户的商品时,ID将根据此格式生成。它将存储在商品的custom_id属性中。

ID生成

有两种方法可以生成ID

1. ✋ 手动ID生成

当用户创建新产品时生成ID

$user = auth()->user(); // Logged in as 'Jane'

$product = new Product([
    'name' => 'Jacket',
    'slug' => 'jacket',
    'description' => 'Hand crafted jacket, by me (Jane).',
]);

UserCustomId::generateFor($product, $user);

$product->save();

根据用户之前创建的配置,ID将生成为类似product-Jane-FXALW-1的内容。它将保存在产品的custom_id属性中。如果用户创建另一个产品,其ID将类似于product-Jane-3QJ5A-2

2. 🤖 自动生成ID

HasUserCustomId接口和WithUserCustomId特性应用到您的模型以自动生成

use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Model;
use Luttje\UserCustomId\Contracts\HasUserCustomId;
use Luttje\UserCustomId\Traits\WithUserCustomId;

class Category extends Model implements HasUserCustomId
{
    use HasUuids;
    use WithUserCustomId;

    protected $fillable = [
        'name',
        'slug',
        'description',
        'owner_id',
    ];

    protected $hidden = [
        'id',
    ];

    public function owner()
    {
        return $this->belongsTo(User::class);
    }

    public function products()
    {
        return $this->hasMany(Product::class);
    }
}

注意

在您的模型中实现getOwner()方法以定义ID样式的所有者。默认情况下,它使用所有者关系,但您可以自定义它。

使用上述实现,ID将在模型的Eloquent creating事件上自动生成。它将在模型配置的属性中存储ID。

自定义所有者模型

您可以指定任何模型作为ID样式的所有者,而不仅仅是登录用户。将所有者模型作为generateFor的第二个参数提供。或者,让实现HasUserCustomId接口的模型中的getOwner()方法返回所有者模型。

根据您的具体情况,可能更有意义让TenantTeam模型成为ID样式的所有者。

理解格式块

格式由“块”组成,是特定值的占位符。例如,product-{attribute-owner:name}-{random:5}-{increment}包含几个块

  • 产品-
  • {attribute-owner:name}:拥有模型的名字。
  • -
  • {random:5}:一个随机的5位字符串。
  • -
  • {increment}:递增的数字。

每个块都遵循{name:parameters}的格式,每种类型都有特定的参数。除了字面块,它们只是字面字符串(如上面的product--块)。

块类型

  • {increment:amount:group-by:group-symbol}:递增数字。
  • {attribute-owner:attribute:start:length}:拥有模型属性值(或其一部分)
  • {random:length:characters}:随机字符。
  • {attribute-target:attribute:start:length}:目标模型属性值(或其一部分)
  • {attribute-relation:attribute:start:length}:相关模型属性值(或其一部分)
  • {uuid:version}:通用唯一标识符
  • 时间块:{year}{month:format}{day}等。

» 查看关于所有可用块和属性的🍪 格式块文档以了解更多信息。

测试

然后使用以下命令运行测试

composer test

许可证

此软件包是开源软件,许可协议为MIT许可证。请参阅许可证文件以获取更多信息。