dive-be/laravel-snowflake

使用 Twitter Snowflake 生成标识符

1.3.0 2024-03-14 12:59 UTC

This package is auto-updated.

Last update: 2024-09-22 11:56:35 UTC


README

Social Card of Laravel Dry Requests

❄️ 使用 Twitter Snowflake 生成 ID

Latest Version on Packagist

此包帮助您为 Eloquent 模型创建 Snowflake 标识符

它是 godruoyi/php-snowflake 的 Laravel 封装。

此包解决了什么问题?

有关 Snowflake 的更多信息,请参阅 原始库

安装

您可以通过 composer 安装此包

composer require dive-be/laravel-snowflake

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

php artisan vendor:publish --provider="Dive\Snowflake\ServiceProvider" --tag="config"

这是发布配置文件的内容

return [

    /**
     * Set this value to today when starting a new app.
     * You will have 69 years before you run out of snowflakes.
     */
    'start_date' => '2022-04-10',
];

使用方法

⚠️ 使用高性能缓存驱动程序,如 Redis,以确保快速生成 ID。

❗️ 生产环境中不要使用如 array 的短暂缓存驱动程序!

迁移

  • 使用 snowflake 定义 Snowflake 列
  • 使用 foreignSnowflake 引用另一个 Snowflake(foreignId 的别名)
Schema::table('products', static function (Blueprint $table) {
    $table->snowflake();
    $table->foreignSnowflake('variant_id')->constrained();
});

模型

在您的 Eloquent 模型中使用 HasSnowflake 特性

class Product extends Model
{
    use HasSnowflake;
}

手动生成

如果您想手动生成 Snowflake 标识符,有几个选项可供选择

Snowflake::id(); // Facade
snowflake(); // Helper
app('snowflake'); // Service Locator

// Dependency Injection
public function __construct(\Godruoyi\Snowflake\Snowflake $snowflake) {}

📣 关于 JavaScript 兼容性的说明

虽然 JavaScript 本身实际上 支持 BigInt,但 JSON 标准不支持。

JSON.parse("{\"a\":10n}")
// Uncaught SyntaxError: Unexpected token n in JSON at position 7

因此,为了确保在客户端使用 JSON.parse 等类似方法反序列化时标识符不会被截断,该包将自动将模型的 id 字段转换为 string

测试

composer test

变更日志

有关最近更改的更多信息,请参阅 CHANGELOG

贡献

有关详细信息,请参阅 CONTRIBUTING

安全

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

鸣谢

许可

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