Как я могу сгенерировать уникальный идентификатор в Symfony 4?

Я хочу создать уникальный идентификатор, поэтому в моем Controller.php я пишу это:

use Symfony\Component\Validator\Constraints\Uuid;

а позже в моей функции:

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

Но я получаю сообщение об ошибке:

Attempted to call an undefined method named "uuid4" of class "Symfony\Component\Validator\Constraints\Uuid".

функция uniqid () php не подходит? php.net/manual/fr/function.uniqid.php

acucchieri 27.11.2018 14:43

В Symfony нет генератора Uuid. Ограничение просто проверяет действительный uuid. Вам необходимо загрузить сторонний генератор. Доступно несколько. Внимательно прочтите, откуда у вас есть строка Uuid :: uuid4 (). Вероятно, речь идет об установке определенного пакета. И нет, uniqid - это не то же самое, что uuid.

Cerad 27.11.2018 14:44

Но uniqid () небезопасен. Он основан на текущем времени.

peace_love 27.11.2018 14:44

Для чего вам нужен этот $unique_id ?

Fabian Schmick 27.11.2018 14:51

Если вам нужен UUID, соответствующий RFC4122, вы можете использовать github.com/ramsey/uuid

acucchieri 27.11.2018 15:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
5
5
13 758
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Можно использовать ramsey/uuid от https://packagist.org/packages/ramsey/uuid

composer require ramsey/uuid

После установки:

use Ramsey\Uuid\Uuid;

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

Вы можете проверить документацию для получения дополнительной информации.

Спасибо! Но я получаю ошибку Attempted to call function "generateUid" from namespace "App\Controller".

peace_love 28.11.2018 09:54

Чтобы использовать функцию, вы должны добавить use Ramsey\Uuid\Uuid; и напрямую вызвать: $unique_id = $this->uuid = Uuid::uuid4(); и использовать

wanna know 28.11.2018 10:00

Только доктрина может автоматически сгенерировать для вас 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.

adxl 28.11.2021 16:08

Если вы добавляете поле к сущности и вам нужен автоматически сгенерированный UUID для этого поля, и у вас уже есть автоматически сгенерированный идентификатор автоинкремента, вы можете выполнить генерацию перед сохранением сущности.

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');
}

Вот объяснение, почему более одной автогенерации через аннотации не работает с Doctrine

Другие вопросы по теме