Я хочу создать уникальный идентификатор, поэтому в моем 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".
В Symfony нет генератора Uuid. Ограничение просто проверяет действительный uuid. Вам необходимо загрузить сторонний генератор. Доступно несколько. Внимательно прочтите, откуда у вас есть строка Uuid :: uuid4 (). Вероятно, речь идет об установке определенного пакета. И нет, uniqid - это не то же самое, что uuid.
Но uniqid () небезопасен. Он основан на текущем времени.
Для чего вам нужен этот $unique_id ?
Если вам нужен UUID, соответствующий RFC4122, вы можете использовать github.com/ramsey/uuid




Можно использовать 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".
Чтобы использовать функцию, вы должны добавить use Ramsey\Uuid\Uuid; и напрямую вызвать: $unique_id = $this->uuid = Uuid::uuid4(); и использовать
Только доктрина может автоматически сгенерировать для вас 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.
Если вы добавляете поле к сущности и вам нужен автоматически сгенерированный 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
функция uniqid () php не подходит? php.net/manual/fr/function.uniqid.php