Атрибут CustomIdGenerator
Атрибут CustomIdGenerator вешается на свойство
сущности, помеченное как Id, и говорит
Doctrine использовать пользовательский класс-генератор
для получения значения первичного ключа. Первым
параметром передаётся имя класса генератора, который
реализует интерфейс AbstractIdGenerator.
В отличие от GeneratedValue со стратегией
CUSTOM, атрибут CustomIdGenerator
позволяет задать генератор прямо в сущности без
изменения конфигурации.
Синтаксис
#[CustomIdGenerator(class: GeneratorClass::class)]
Пример
Давайте создадим собственный генератор, который
возвращает строку формата 'user-' с
порядковым номером:
<?php
namespace AppDoctrine;
use DoctrineORMMapping;
use DoctrineORMIdAbstractIdGenerator;
class UserIdGenerator extends AbstractIdGenerator
{
public function generateId(
?MappingClassMetadata $metadata,
?object $entity
): string {
return 'user-' . uniqid();
}
}
?>
Теперь применим этот генератор в сущности:
<?php
namespace AppEntity;
use AppDoctrineUserIdGenerator;
use DoctrineORMMapping as ORM;
#[ORMEntity]
class User
{
#[ORMId]
#[ORMColumn(type: 'string', length: 255)]
#[ORMCustomIdGenerator(class: UserIdGenerator::class)]
private string $id;
#[ORMColumn(type: 'string', length: 255)]
private string $name;
public function getId(): string
{
return $this->id;
}
public function getName(): string
{
return $this->name;
}
public function setName(string $name): void
{
$this->name = $name;
}
}
?>
После сохранения сущности через EntityManager
идентификатор будет сгенерирован автоматически:
<?php
namespace AppController;
use AppEntityUser;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class UserController extends AbstractController
{
#[Route('/user', name: 'user_create')]
public function create(EntityManagerInterface $em): Response
{
$user = new User();
$user->setName('abcde');
$em->persist($user);
$em->flush();
return new Response($user->getId());
}
}
?>
Результат выполнения кода:
"user-65f1a2b3c4d5e"
Пример
Давайте создадим генератор, который возвращает числовое значение на основе текущего времени:
<?php
namespace AppDoctrine;
use DoctrineORMMapping;
use DoctrineORMIdAbstractIdGenerator;
class TimestampIdGenerator extends AbstractIdGenerator
{
public function generateId(
?MappingClassMetadata $metadata,
?object $entity
): int {
return time();
}
}
?>
Применим генератор к сущности Article:
<?php
namespace AppEntity;
use AppDoctrineTimestampIdGenerator;
use DoctrineORMMapping as ORM;
#[ORMEntity]
class Article
{
#[ORMId]
#[ORMColumn(type: 'integer')]
#[ORMCustomIdGenerator(class: TimestampIdGenerator::class)]
private int $id;
#[ORMColumn(type: 'string', length: 255)]
private string $title;
public function getId(): int
{
return $this->id;
}
public function getTitle(): string
{
return $this->title;
}
public function setTitle(string $title): void
{
$this->title = $title;
}
}
?>
После сохранения сущности идентификатор будет равен метке времени создания:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_create')]
public function create(EntityManagerInterface $em): Response
{
$article = new Article();
$article->setTitle('hello');
$em->persist($article);
$em->flush();
return new Response((string) $article->getId());
}
}
?>
Результат выполнения кода:
"1742385600"
Смотрите также
-
атрибут
Id,
который помечает свойство как первичный ключ -
атрибут
GeneratedValue,
который задаёт стратегию генерации значения -
атрибут
SequenceGenerator,
который настраивает генерацию через последовательность -
атрибут
Entity,
который помечает класс как сущность Doctrine