*/ 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:----ZCq441kISP3qRPIS3DY/awi38JqdS+ag6aujoZwCSabIYZ7EPnimN7Z7pYj1np609AKx52kW21toUDyh/M7vRj/vl4khlDrwooRZUByXHtk1C2CAKwyq3GMdbq7kM/1pAlPxWd+flEQRlZBoULaTN3qCjwuvX+XlHwf+4Hk9+ntGUe2p5K9cZER3gqfrqRZ/ljGNxr0I5A3YXr9DCfusZAHkadDYCVlt0RGApbyS6+x4Y70SuDstc9PJDgORJNbG6MMyDZR2cUbe3PiOdLmswKnSytrNO2vGY8MqDfW+vhH1X39sURRLpiSLDNtW4SKC06Td+ghAIgIexn8V/L805pTU2Mb5870sEGiZFlWCXvT0jghg+53+iQLpBIvpxaYnjj7S+azfq95steCAKYsZnIUlGEB+QtafQf6viZbucObjHBNs0Lw+2bGNj4pyhSbK1WX2ozYaL4vRHpejv9QWeQpXlVbwuqWDin0nA3pzrwsKnWIHV0h6cnL7kXafqA9qIjzMUUpSb2Q1ipu1YeqS3Ua0vZX+CeqZbaotm8BBxU1O+0CjsVjSwFOqoFOOmTR1yboGqtPQ6h/WWpN7B46WIEnF4gervCeyZaV+Ubp/COTtebCiWk0IS6Oql0oan5qx+NujTXpiuXJhKc7AJxo7A8bQ9joRK9ScYm1WIbUHyJU=----ATTACHMENT:----ODA2OTYxNzYzMjkzNTA4MyA2NzkyNTA5NjQyMDA5NDQ5IDY0MDE2MjI0NDQ3MjMzMDM=