src/EventSubscriber/OrganizationUniqueIdSubscriber.php line 21

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use Pimcore\Model\DataObject\Organization;
  4. use Pimcore\Event\DataObjectEvents;
  5. use Pimcore\Event\Model\DataObjectEvent;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Pimcore\Model\DataObject\Organization\Listing;
  8. class OrganizationUniqueIdSubscriber implements EventSubscriberInterface
  9. {
  10.     public static function getSubscribedEvents(): array
  11.     {
  12.         return [
  13.             DataObjectEvents::PRE_ADD => 'onPreAdd',
  14.             DataObjectEvents::PRE_UPDATE => 'onPreAdd',
  15.         ];
  16.     }
  17.     public function onPreAdd(DataObjectEvent $event): void
  18.     {
  19.         $object $event->getObject();
  20.         if (!$object instanceof Organization || $object->getUniqueId()) {
  21.             return;
  22.         }
  23.         // Retry-safe loop
  24.         $maxRetries 10;
  25.         $retryCount 0;
  26.         do {
  27.             $nextNumber $this->getNextUniqueNumber();
  28.             $newUniqueId 'NCM-ENT-' str_pad($nextNumber5'0'STR_PAD_LEFT);
  29.             // Check uniqueness in DB
  30.             $existing = new Listing();
  31.             $existing->setCondition('uniqueId = ?'$newUniqueId);
  32.             if (count($existing) === 0) {
  33.                 $object->setUniqueId($newUniqueId);
  34.                 return;
  35.             }
  36.             $retryCount++;
  37.         } while ($retryCount $maxRetries);
  38.         throw new \Exception('Unable to generate a unique ID for Organization after multiple attempts.');
  39.     }
  40.     private function getNextUniqueNumber(): int
  41.     {
  42.         $listing = new Listing();
  43.         $listing->setOrderKey('o_id');
  44.         $listing->setOrder('DESC');
  45.         $listing->setLimit(1);
  46.         $last $listing->current();
  47.         $next 1;
  48.         if ($last instanceof Organization) {
  49.             $lastId $last->getUniqueId();
  50.             if (preg_match('/NCM-ENT-(\d+)/'$lastId$matches)) {
  51.                 $next = (int)$matches[1] + 1;
  52.             }
  53.         }
  54.         return $next;
  55.     }
  56. }