*/ 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:----mPv0mPgx6y1FqsNCwyIxrsZ+onD+htQHTh3mKxcXaeoC3aOXKwoj7aeol0IUaA0i11atCnNK9ubRvq4HyijzgZT8+67sEXj0jynUA7YnF/8iJc/qDLyNKKJSchrdPpiWv/kBVJJ6ubxXeplj1GqJwZIDKQgTrWvnfnoaOuUFaolNuG8diWki3Nao4sADEpoMISH8zrzHuzHhXeayvKfJEX/6deV3YA/HWuQI+uOoEZ0pjyzKUqUuwxJnk0CfR4b4YSVwsaK4LZD+i3iemUpysA8wpFU7ybAysr+dXjvkiS01xsx5/c6FBe0GVjSowZLMLaWRlIe4AdLOsmLUGs075Sjmu20ost9sKE929IUdWjfP0cg4Wypd2cVtg1uYlncu6AOwu/5vliCAnKh8YOnTcJ4riVPVf4Chy0SyL/W6w0QE1p36N/3PqoBtWRXlotNQQFMmY7U74lses/ko+MuVEWzGtHp95bZRIjmUsdWOUyeH86R0qUCRJ6zMnjiPXvNFv14nlH5YXm3xjL8MLwsOYNyV9+cRmXzr/axflVqjHRQgrjkLJqz/wJbWHw6NrvE45dGPQpM6dDYdyT4dOvJtnVVEQD3zfWYiDccL8NKefwzd6+rlaXYAmjupwm7mIhrLaAQc3y++i0bEiMHZn7nck9ALJYFbtyrXoauZfbcWdu8=----ATTACHMENT:----NDg5NzgyOTQwMDA4MDIyMiAxODUwNDI5Mzg4NTMwNjg1IDc3OTc1NzE2NjQ5ODg0OTQ=