FestinHegre/vendor/symfony/doctrine-bridge/IdGenerator/UuidGenerator.php
2024-09-26 17:26:04 +02:00

82 lines
2.3 KiB
PHP

<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Bridge\Doctrine\IdGenerator;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Id\AbstractIdGenerator;
use Symfony\Component\Uid\Factory\NameBasedUuidFactory;
use Symfony\Component\Uid\Factory\RandomBasedUuidFactory;
use Symfony\Component\Uid\Factory\TimeBasedUuidFactory;
use Symfony\Component\Uid\Factory\UuidFactory;
use Symfony\Component\Uid\Uuid;
final class UuidGenerator extends AbstractIdGenerator
{
private readonly UuidFactory $protoFactory;
private UuidFactory|NameBasedUuidFactory|RandomBasedUuidFactory|TimeBasedUuidFactory $factory;
private ?string $entityGetter = null;
public function __construct(?UuidFactory $factory = null)
{
$this->protoFactory = $this->factory = $factory ?? new UuidFactory();
}
/**
* doctrine/orm < 2.11 BC layer.
*/
public function generate(EntityManager $em, $entity): Uuid
{
return $this->generateId($em, $entity);
}
public function generateId(EntityManagerInterface $em, $entity): Uuid
{
if (null !== $this->entityGetter) {
if (\is_callable([$entity, $this->entityGetter])) {
return $this->factory->create($entity->{$this->entityGetter}());
}
return $this->factory->create($entity->{$this->entityGetter});
}
return $this->factory->create();
}
public function nameBased(string $entityGetter, Uuid|string|null $namespace = null): static
{
$clone = clone $this;
$clone->factory = $clone->protoFactory->nameBased($namespace);
$clone->entityGetter = $entityGetter;
return $clone;
}
public function randomBased(): static
{
$clone = clone $this;
$clone->factory = $clone->protoFactory->randomBased();
$clone->entityGetter = null;
return $clone;
}
public function timeBased(Uuid|string|null $node = null): static
{
$clone = clone $this;
$clone->factory = $clone->protoFactory->timeBased($node);
$clone->entityGetter = null;
return $clone;
}
}