如何在Symfony 4中生成唯一的ID?

时间:2018-11-27 13:37:54

标签: symfony uuid unique-id

我想创建一个唯一的ID,因此在我的Controller.php中,我这样写:

use Symfony\Component\Validator\Constraints\Uuid;

以及以后在我的函数中:

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

但是我收到错误消息:

  

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

3 个答案:

答案 0 :(得分:3)

在将对象持久保存到数据库时,只有原则可以为您自动生成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
        }
    }
}

答案 1 :(得分:2)

您可以使用https://packagist.org/packages/ramsey/uuid中的ramsey/uuid

composer require ramsey/uuid

安装后:

use Ramsey\Uuid\Uuid;

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

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

答案 2 :(得分:0)

如果您向实体添加一个字段并需要为该字段自动生成 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