【问题标题】:How can I generate an unique id in Symfony 4?如何在 Symfony 4 中生成唯一 ID?
【发布时间】:2019-04-29 06:31:58
【问题描述】:

我想创建一个唯一的 id,所以在我的Controller.php 中,我这样写:

use Symfony\Component\Validator\Constraints\Uuid;

后来在我的功能中:

$unique_id = $this->uuid = Uuid::uuid4();

但我收到错误消息:

试图调用类的名为“uuid4”的未定义方法 “Symfony\Component\Validator\Constraints\Uuid”。

【问题讨论】:

  • uniqid() php 函数不合适? php.net/manual/fr/function.uniqid.php
  • Symfony 没有提供 Uuid 生成器。约束只检查有效的 uuid。您需要加载第三方生成器。有几种可用。仔细阅读从哪里获得 Uuid::uuid4() 行。它可能谈论安装特定的软件包。不,uniqid 与 uuid 不同。
  • 但是 uniqid() 不安全。它基于当前时间。
  • 你需要这个$unique_id 的目的是什么?
  • 如果你想要一个符合 RFC4122 的 UUID,你可以使用github.com/ramsey/uuid

标签: symfony uuid unique-id


【解决方案1】:

你可以从https://packagist.org/packages/ramsey/uuid使用ramsey/uuid

composer require ramsey/uuid

安装后:

use Ramsey\Uuid\Uuid;

function generateUid()
{
   return Uuid::uuid4();
}

您可以查看文档以获取更多信息。

【讨论】:

  • 谢谢!但我收到错误Attempted to call function "generateUid" from namespace "App\Controller".
  • 要使用该功能,您必须添加use Ramsey\Uuid\Uuid;并直接调用:$unique_id = $this->uuid = Uuid::uuid4();并使用
【解决方案2】:

在将对象持久化到数据库时,只有教义可以自动为您生成 uuid。你可以在你的实体中这样设置它。

/**
 *
 * @ORM\Id
 * @ORM\Column(name="id", type="guid")
 * @ORM\GeneratedValue(strategy="UUID")
 */
protected $id;

这有时确实是个问题,当您立即需要 uuid 以获取代码中的进一步说明时,但此时您无法持久保存该对象。所以我使用这个包获得了很好的体验:

https://packagist.org/packages/ramsey/uuid

<?php

namespace YourBundle\Controller;

use Ramsey\Uuid\Uuid;

/**
 * Your controller.
 *
 * @Route("/whatever")
 */
class YourController extends Controller
{
    /**
     * @Route("/your/route", name="your_route")
     */
    public function yourFunction(Request $request)
    {
        try {
            $uuidGenerator = Uuid::uuid4();
            $uuid = $uuidGenerator->toString();
        } catch (\Exception $exception) {
            // Do something
        }
    }
}

【讨论】:

  • 为了更新这个答案,现在不推荐使用学说 UUID 策略(2021 年)。请改用 ramsey/uuid。
【解决方案3】:

如果您将字段添加到实体并需要为该字段自动生成 UUID,并且您已经有自动生成的自动增量 ID,那么您可以在持久化实体之前进行生成。

use Symfony\Component\Uid\Uuid;

// ...

/**
 * @var string
 *
 * @ORM\Column(name="uuid", type="guid", unique=true)
 */
private $uuid;

/**
 * @ORM\PrePersist()
 */
public function prePersist()
{
    $this->setDateCreated($this->getDateCreated() ?: (new DateTime()));
    $this->uuid = Uuid::v4()->toRfc4122();
}

另外,您可能需要修改迁移

public function preUp(Schema $schema) : void
{
    $this->addSql('ALTER TABLE table_name ADD uuid CHAR(36) DEFAULT NULL COMMENT \'(DC2Type:guid)\'');
    $this->addSql('CREATE UNIQUE INDEX UNIQ_1C1B038BD17F50A6 ON table_name (uuid)');
}

public function up(Schema $schema) : void
{
    // this up() migration is auto-generated, please modify it to your needs
    $this->addSql('UPDATE table_name SET uuid = UUID()');
    $this->addSql('ALTER TABLE table_name CHANGE uuid uuid CHAR(36) NOT NULL COMMENT \'(DC2Type:guid)\'');
}

public function down(Schema $schema) : void
{
    // this down() migration is auto-generated, please modify it to your needs
    $this->addSql('DROP INDEX UNIQ_1C1B038BD17F50A6 ON table_name');
    $this->addSql('ALTER TABLE table_name DROP uuid');
}

这里解释了为什么more than one autogeneration thru annotations doesn't work with Doctrine

【讨论】:

    猜你喜欢
    • 2017-06-02
    • 2018-05-04
    • 2023-03-15
    • 2010-11-30
    • 2013-03-11
    • 2018-10-20
    • 1970-01-01
    • 2016-03-26
    • 2012-03-21
    相关资源
    最近更新 更多