luttje / laravel-user-custom-id
允许用户配置ID样式,然后在您的应用程序中使用该ID样式。
Requires
- php: ^8.1
- illuminate/contracts: ^10.0
- spatie/laravel-package-tools: ^1.15.0
Requires (Dev)
- larastan/larastan: ^2.0.1
- laravel/pint: ^1.0
- luttje/php-example-tester: ^0.2.1
- nunomaduro/collision: ^7.9
- orchestra/testbench: ^8.0
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- phpunit/phpunit: ^10.5
README
这个Laravel包允许用户在您的应用程序中创建和使用自定义ID样式。例如,像Jane这样的用户可以为产品ID设置一个格式,如product-{attribute-owner:name}-{random:5}-{increment}
。一旦配置完成,应用程序就可以为Jane的产品生成ID,例如第一个产品的ID为product-Jane-z4AyW-1
,第二个产品的ID为product-Jane-3QJ5A-2
等。
警告
此包仍在开发中。它尚未准备好用于生产,API可能在任何时候更改。
安装
您可以通过composer安装此包
composer require luttje/laravel-user-custom-id
👨🔧 使用方法
场景
想象一个拥有多个商店的网店系统。用户需要可定制的产品ID。例如
- 用户A喜欢像
123
、124
、125
这样的顺序号。 - 用户B选择带有前缀的数字,如
A-123
、A-124
。 - 用户Jane喜欢像
product-Jane-z4AyW-1
、product-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()方法返回所有者模型。
根据您的具体情况,可能更有意义让Tenant
或Team
模型成为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许可证。请参阅许可证文件以获取更多信息。