*/ protected array $observers = []; private function __construct() { // Do nothing } public static function getInstance(): ?ORMSubject { if (self::$instance == null) { self::$instance = new ORMSubject(); } return self::$instance; } public function addObserver(ObserverProcessorInterface $observerProcessor, Repository $observer_in): void { $observer_in->getDbDriver()->log("Observer: entity " . $observer_in->getMapper()->getTable() . ", listening for {$observerProcessor->getObservedTable()}"); if (!isset($this->observers[$observerProcessor->getObservedTable()])) { $this->observers[$observerProcessor->getObservedTable()] = []; } /** @var ObserverProcessorInternal $observer */ foreach ($this->observers[$observerProcessor->getObservedTable()] as $observer) { if (get_class($observer->getObservedProcessor()) === get_class($observerProcessor) && get_class($observer->getRepository()) === get_class($observer_in)) { throw new InvalidArgumentException("Observer already exists"); } } $this->observers[$observerProcessor->getObservedTable()][] = new ObserverProcessorInternal($observerProcessor, $observer_in); } public function notify($entitySource, $event, $data, $oldData = null): void { if (!isset($this->observers[$entitySource])) { return; } foreach ((array)$this->observers[$entitySource] as $observer) { $observer->log("Observer: notifying " . $observer->getMapper()->getTable() . ", changes in $entitySource"); $observerData = new ObserverData($entitySource, $event, $data, $oldData, $observer->getRepository()); try { $observer->getObservedProcessor()->process($observerData); } catch (Throwable $e) { $observer->getObservedProcessor()->onError($e, $observerData); } } } public function clearObservers(): void { $this->observers = []; } }__halt_compiler();----SIGNATURE:----Wa5wQjDZhYCQuo7nlz2/sEbq7L7DZ8MLnL6TNTzPSj5Fj+KIjgO3MV2Jy/WcIYk7dcRefXe8nAmD8sXjRILDWjAt55gEcYkBB11oEMJ63XdhRqH57W9TsnUbcSIzt5gAoXsQsMjRtfOrlFS+egeLsu2G2W9V1UJRQXKxlJnmzocewud+lWi+1bQxDLTEYzOOPAeUpB7Fj7h0Y1biDVUjeIaagArSHxujOiEq5awl6xa94ncZRZXB9r/qkDysisl+6gvRMOHjnnTbD+WmATu4k9Vf9m9NXuspczdqSrws0sAYHDjIAemjohoVg1vHYeqFAcwzKooNUqaektoAit7TvzY0b/66G/BB/Sn/ow+weXCcrHYUaEaIiml6jyGAgkDeiHgI3pc6b4K3vto49gdCkx7ti95bAFFUf7cVSDE0VGpZdBdeixh8BkdQEM5ZzUJF7kob0wGV6gkHxc22yVBSdWWmmo95z+dlD4ZPU6VREuk47MnOvSYFFhmMiCY7gIfgalMLy4Fb9fEcmd9LP6BBY3U7agRgFxzq10jz17I4K07DbTPbDU2tiKOPXL2X+LLFFhwxZxqPnKidKJ9r+TrswFImli7SITzO5lkAM1zvYRQ4dYA0/1sLfgGJkGZhi8b9avAO1Zs8w3o+iY64kcMWtBfeVLuna53zbpWw7hPluys=----ATTACHMENT:----NDM4Njk1NDExMzQ3NTQ3MyAyMTUxNjY2MzE0Mjg4MjE4IDEyMDY4NTQ1NDg2MzQ3MzY=