'application/Espo/Resources/autoload.json', 'modulePath' => 'application/Espo/Modules/{*}/Resources/autoload.json', 'customPath' => 'custom/Espo/Custom/Resources/autoload.json', ]; protected $config; protected $metadata; protected $dataCache; protected $fileManager; protected $loader; public function __construct( Config $config, Metadata $metadata, DataCache $dataCache, FileManager $fileManager, Loader $loader ) { $this->config = $config; $this->metadata = $metadata; $this->dataCache = $dataCache; $this->fileManager = $fileManager; $this->loader = $loader; } public function get($key = null, $returns = null) { if (!isset($this->data)) { $this->init(); } if (!isset($key)) { return $this->data; } return Util::getValueByKey($this->data, $key, $returns); } public function getAll() { return $this->get(); } protected function init() { $useCache = $this->config->get('useCache'); if ($useCache && $this->dataCache->has($this->cacheKey)) { $this->data = $this->dataCache->get($this->cacheKey); return; } $this->data = $this->unify(); if ($useCache) { $result = $this->dataCache->store($this->cacheKey, $this->data); } } protected function unify() { $data = $this->loadData($this->paths['corePath']); foreach ($this->metadata->getModuleList() as $moduleName) { $modulePath = str_replace('{*}', $moduleName, $this->paths['modulePath']); $data = array_merge($data, $this->loadData($modulePath)); } $data = array_merge($data, $this->loadData($this->paths['customPath'])); return $data; } protected function loadData($autoloadFile, $returns = []) { if (file_exists($autoloadFile)) { $content = $this->fileManager->getContents($autoloadFile); $arrayContent = Json::getArrayData($content); if (!empty($arrayContent)) { return $this->normalizeData($arrayContent); } $GLOBALS['log']->error('Autoload: Empty file or syntax error ['.$autoloadFile.'].'); } return $returns; } protected function normalizeData(array $data) { $normalizedData = []; foreach ($data as $key => $value) { switch ($key) { case 'psr-4': case 'psr-0': case 'classmap': case 'files': case 'autoloadFileList': $normalizedData[$key] = $value; break; default: $normalizedData['psr-0'][$key] = $value; break; } } return $normalizedData; } public function register() { try { $autoloadList = $this->getAll(); } catch (Exception $e) {} //bad permissions if (!empty($autoloadList)) { $this->loader->register($autoloadList); } } }