michalsn/codeigniter4-uuid

适用于CodeIgniter 4的UUID包,支持模型和实体。

v1.1.0 2024-04-22 14:12 UTC

This package is auto-updated.

Last update: 2024-09-22 15:11:32 UTC


README

此包简化了在CodeIgniter 4中处理UUID的工作。它提供了四个类来实现这一点:UuidUuidModelUuidEntityUuidCast。此实现与Ramsey\Uuid紧密耦合。

通过composer安装

composer require michalsn/codeigniter4-uuid

手动安装

下载此仓库,然后通过编辑 app/Config/Autoload.php 并将 Michalsn\UuidModel 命名空间添加到 $psr4 数组中来启用它。例如,如果您将其复制到 app/ThirdParty

<?php

$psr4 = [
    'Config'      => APPPATH . 'Config',
    APP_NAMESPACE => APPPATH,
    'App'         => APPPATH,
    'Michalsn\Uuid' => APPPATH . 'ThirdParty/codeigniter4-uuid/src',
];

版本

如何使用它

通常,使用UuidModelUuidEntity与使用CodeIgniter 4框架提供的原始类没有太大区别。我们只是有一些额外的配置选项。您可能根本不需要使用Uuid类,因为大多数事情都已经自动化。

Uuid

Uuid类一起工作非常简单

<?php

$uuid = service('uuid');
// will prepare UUID4 object
$uuid4 = $uuid->uuid4();
// will assign UUID4 as string
$string = $uuid4->toString();
// will assign UUID4 as byte string
$byte_string = $uuid4->getBytes();

如果您需要为特定UUID版本设置任何额外的配置选项,则可以通过配置文件来完成。

UuidModel

UUID字段始终以string形式返回,即使我们在数据库中以字节格式存储它们。这一决定是出于使用方便的考虑。我们不必担心字段类型或数据转换。

现在,让我们看看如何在代码中使用UuidModel的一个简单示例。在下面的示例中,没有进行任何额外的更改,只是我们的模型扩展了UuidModel。主键将以UUID4的字节格式存储在数据库中。

<?php

namespace App\Models;

use Michalsn\Uuid\UuidModel;

class Project1Model extends UuidModel
{
    protected $table      = 'projects_1';
    protected $primaryKey = 'id';

    protected $returnType = 'array';
    protected $useSoftDeletes = true;

    protected $allowedFields = ['name', 'description', 'created_at', 'updated_at', 'deleted_at'];

    protected $useTimestamps = true;

    protected $validationRules = [
        'name' => 'required|min_length[3]',
        'description' => 'required',
    ];
}

现在,这里有一个示例,我们将使用UUID,但不是作为主键。

<?php

namespace App\Models;

use Michalsn\Uuid\UuidModel;

class Project2Model extends UuidModel
{
    protected $uuidFields = ['category_id'];

    protected $table      = 'projects_2';
    protected $primaryKey = 'id';

    protected $returnType = 'array';
    protected $useSoftDeletes = true;

    protected $allowedFields = ['category_id', 'name', 'description', 'created_at', 'updated_at', 'deleted_at'];

    protected $useTimestamps = true;

    protected $validationRules = [
        'category_id' => 'required',
        'name' => 'required|min_length[3]',
        'description' => 'required',
    ];
}

UuidEntity

只有在我们将UUID字段以字节格式存储时才需要使用UuidEntity。在其他情况下,它没有比原始Entity类更多的优点。与UuidModel类似,默认情况下,我们假设只有主键将具有UUID类型。

现在让我们看看两个示例,这些示例与之前显示的模型示例相匹配。

<?php

namespace App\Entities;

use Michalsn\Uuid\UuidEntity;

class Project1Entity extends UuidEntity
{
    protected $attributes = [
        'id' => null,
        'name' => null,
        'description' => null,
        'created_at' => null,
        'updated_at' => null,
        'deleted_at' => null,
    ];
}
<?php

namespace App\Entities;

use Michalsn\Uuid\UuidEntity;

class Project2Entity extends UuidEntity
{
    protected $uuids = ['category_id'];

    protected $attributes = [
        'id' => null,
        'category_id' => null,
        'name' => null,
        'description' => null,
        'created_at' => null,
        'updated_at' => null,
        'deleted_at' => null,
    ];
}

就是这样。不需要更多更改。

UuidCast

注意:如果您打算使用UuidModel类,请不要使用此转换类。

由于CodeIgniter现在允许在实体中使用自定义转换类,我们已添加了自己的转换类。此转换类使UUID在数据检索期间从字节转换为字符串,并在数据设置时反向转换。通常您不需要使用转换函数,因为从字符串到字节的转换是在UuidModel类中完成的。考虑到这一点,您应该仅在您想稍后不使用UuidModel类而与实体一起工作时才使用此转换功能。

这是我们将如何使用我们的转换类与实体一起的一个简单示例。

<?php

namespace App\Entities;

class MyEntity extends Entity
{
    protected $casts = [
        'id' => 'uuid',
    ];

    protected $castHandlers = [
        'uuid' => 'Michalsn\Uuid\UuidCast',
    ];
}

限制

目前,当您想以字节格式存储UUID时,此类不支持SQLite3数据库。

支持的UUID版本

  • 版本1:基于时间 - uuid1
  • 版本2:DCE安全 - uuid2
  • 版本3:基于名称(MD5) - uuid3
  • 版本4:随机 - uuid4
  • 版本 5:基于名称(SHA-1) - uuid5
  • 版本 6:有序时间(非标准) - uuid6

许可证

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