yieldstudio/eloquent-public-id

Eloquent Public ID Trait for Laravel 9 及以上版本。

1.0.3 2024-07-22 10:29 UTC

This package is auto-updated.

Last update: 2024-09-22 11:00:47 UTC


README

Latest Version GitHub Workflow Status Total Downloads

功能介绍

公共ID的目的是保持一个完整且可增量的ID,同时向前端暴露UUID,这可以方便出于安全考虑。

此包提供两个功能

  • 允许模型管理公共ID
  • 允许FormRequest轻松将公共ID转换为ID

安装

您可以通过composer安装此包

composer require yieldstudio/eloquent-public-id

HasPublicId 特性

此特性将使您的模型能够获得处理公共ID所需的所有操作的好处。

一旦安装了包,将公共ID字段添加到您的表中

Schema::create('users', function (Blueprint $table) {
    // ..
    $table->uuid('public_id')->index()->unique();
    // ..
});

下一步,将HasPublicId特性应用于您的模型

<?php

declare(strict_types=1);

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use YieldStudio\EloquentPublicId\HasPublicId;

class User extends Model
{
    use HasPublicId;
}

现在可以使用了 :)

⚠️ 默认情况下,该特性将ID字段标记为隐藏字段并保护公共ID。

该特性为您的模型添加了一些方法,如下所示

更改公共ID列的名称

如果您的迁移中选择了除public_id之外的另一个字段名,您必须使用getPublicIdName函数指定此字段。

<?php

declare(strict_types=1);

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use YieldStudio\EloquentPublicId\HasPublicId;

class User extends Model
{
    use HasPublicId;
    
    public function getPublicIdName(): string
    {
        return 'uuid';
    }
}

更改公共ID的生成

公共ID在模型在数据库中创建后会自动生成。如果您想修改此字段的生成值,必须将generatePublicId函数添加到您的模型中

<?php

declare(strict_types=1);

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;
use YieldStudio\EloquentPublicId\HasPublicId;

class User extends Model
{
    use HasPublicId;
    
    public function generatePublicId(): string
    {
        return Str::random();
    }
}

ConvertPublicId 特性

允许在FormRequest中将公共ID转换为ID(在验证之前)。

<?php

declare(strict_types=1);

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use YieldStudio\EloquentPublicId\ConvertPublicId;

class CreatePostRequest extends FormRequest
{
    use ConvertPublicId;

    protected array $publicIdsToConvert = [
        'category_id' => Category::class,
        'tags.*' => Tag::class,
        'postable_id' => 'postable_type', // You can reference another field as model class in case of morph relationship
        'suggestions' => [ // Nesting fields is allowed
            '*' => [
                'post_id' => Post::class,
                'tags.*' => Tag::class,
                'postable_id' => 'postable_type',
            ]
        ]
    ];

单元测试

要运行测试,只需运行composer installcomposer test

联系我们

Yield Studio 的团队随时欢迎您,并使每次互动都成为一次非凡的体验。您可以通过此链接联系我们。

变更日志

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

贡献

请参阅贡献指南获取详细信息。

安全性

如果您发现了关于安全性的错误,请通过contact@yieldstudio.fr而不是使用问题跟踪器来发送邮件。

鸣谢

许可

MIT 许可证 (MIT)。请参阅许可证文件获取更多信息。