Кейс: Понадобилось выставлять в очень редких случаях id сущности вручную. При AUTO стратегии доктрина просто игнорирует все, что ты навставляешь в сущность. Если перейти на CUSTOM стратегию - с поля слетит Auto Increment. Решение: `#[AsEntityListener(event: Events::postPersist, entity: Entity::class)] #[AsEntityListener(event: Events::prePersist, entity: Entity::class)] class EntityListener { private array $manualIds = [];
public function __construct( private EntityManagerInterface $em, ) {}
public function prePersist(Entity $entity): void { if ($entity->getId()) { $classMetadata = $this->em->getClassMetadata(get_class($entity)); $classMetadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE); $classMetadata->setIdGenerator(new AssignedGenerator());
$this->manualIds[] = $entity->getId(); } }
public function postPersist(Entity $entity): void { if (in_array($entity->getId(), $this->manualIds, true)) { $classMetadata = $this->em->getClassMetadata(get_class($entity)); $classMetadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_AUTO); $classMetadata->setIdGenerator(new IdentityGenerator());
$this->em->flush(); } } }`