. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ namespace Espo\Core\Utils; use Espo\Core\Utils\File\ClassMap; /** * Finds classes of a specific category. Category examples: Services, Controllers. * First it checks in the `custom` folder, then modules, then the internal folder. * Available as 'classFinder' service. */ class ClassFinder { /** @var array> */ private $dataHashMap = []; public function __construct(private ClassMap $classMap) {} /** * Reset runtime cache. * * @internal * @since 8.4.0 */ public function resetRuntimeCache(): void { $this->dataHashMap = []; } /** * Find class name by a category and name. * * @return ?class-string */ public function find(string $category, string $name, bool $subDirs = false): ?string { $map = $this->getMap($category, $subDirs); return $map[$name] ?? null; } /** * Get a name => class name map. * * @return array */ public function getMap(string $category, bool $subDirs = false): array { if (!array_key_exists($category, $this->dataHashMap)) { $this->load($category, $subDirs); } return $this->dataHashMap[$category] ?? []; } private function load(string $category, bool $subDirs = false): void { $cacheFile = $this->buildCacheKey($category); $this->dataHashMap[$category] = $this->classMap->getData($category, $cacheFile, null, $subDirs); } private function buildCacheKey(string $category): string { return 'classmap' . str_replace('/', '', $category); } }