Spaces:
No application file
No application file
| declare(strict_types=1); | |
| namespace Mautic\IntegrationsBundle\Sync\SyncDataExchange\Internal; | |
| use Mautic\IntegrationsBundle\Event\InternalObjectEvent; | |
| use Mautic\IntegrationsBundle\IntegrationEvents; | |
| use Mautic\IntegrationsBundle\Sync\Exception\ObjectNotFoundException; | |
| use Mautic\IntegrationsBundle\Sync\SyncDataExchange\Internal\Object\ObjectInterface; | |
| use Symfony\Component\EventDispatcher\EventDispatcherInterface; | |
| class ObjectProvider | |
| { | |
| /** | |
| * Cached internal objects. | |
| * | |
| * @var ObjectInterface[] | |
| */ | |
| private array $objects = []; | |
| public function __construct( | |
| private EventDispatcherInterface $dispatcher | |
| ) { | |
| } | |
| /** | |
| * @throws ObjectNotFoundException | |
| */ | |
| public function getObjectByName(string $name): ObjectInterface | |
| { | |
| $this->collectObjects(); | |
| foreach ($this->objects as $object) { | |
| if ($object->getName() === $name) { | |
| return $object; | |
| } | |
| } | |
| throw new ObjectNotFoundException("Internal object '{$name}' was not found"); | |
| } | |
| /** | |
| * @throws ObjectNotFoundException | |
| */ | |
| public function getObjectByEntityName(string $entityName): ObjectInterface | |
| { | |
| $this->collectObjects(); | |
| foreach ($this->objects as $object) { | |
| if ($object->getEntityName() === $entityName) { | |
| return $object; | |
| } | |
| } | |
| throw new ObjectNotFoundException("Internal object was not found for entity '{$entityName}'"); | |
| } | |
| /** | |
| * Dispatches an event to collect all internal objects. | |
| * It caches the objects to a local property so it won't dispatch every time but only once. | |
| */ | |
| private function collectObjects(): void | |
| { | |
| if (empty($this->objects)) { | |
| $event = new InternalObjectEvent(); | |
| $this->dispatcher->dispatch($event, IntegrationEvents::INTEGRATION_COLLECT_INTERNAL_OBJECTS); | |
| $this->objects = $event->getObjects(); | |
| } | |
| } | |
| } | |