dataRepository = $dataRepository; $this->captionFactory = $captionFactory; } public function findByRecordIds(array $recordIds) { $this->fetchMissing($recordIds); $instances = []; foreach ($recordIds as $index => $recordId) { $instances[$index] = $this->idMap[$recordId]; } return $instances; } public function clear() { $this->idMap = []; } private function fetchMissing(array $recordIds) { $missing = array_diff($recordIds, array_keys($this->idMap)); if (!$missing) { return; } $data = $this->dataRepository->findByRecordIds($missing); $factory = $this->captionFactory; foreach ($data as $recordId => $item) { $this->idMap[(int)$recordId] = $factory($recordId, $item); } } }