'application/Espo/Resources/', 'modulePath' => 'application/Espo/Modules/{*}/Resources/', 'customPath' => 'custom/Espo/Custom/Resources/', ]; private $fileManager; private $metadata; public function __construct(FileManager $fileManager, Metadata $metadata) { $this->fileManager = $fileManager; $this->metadata = $metadata; } /** * Read a resource file. Returns NULL if the file does not exists. * * @throws RuntimeException If the resource does not exist. */ public function read(string $path, FileReaderParams $params): string { $exactPath = $this->findExactPath($path, $params); if (!$exactPath) { throw new RuntimeException("Resource file '{$path}' does not exist."); } return $this->fileManager->getContents($exactPath); } /** * Whether a resource file exists. */ public function exists(string $path, FileReaderParams $params): bool { return $this->findExactPath($path, $params) !== null; } private function findExactPath(string $path, FileReaderParams $params): ?string { $customPath = $this->paths['customPath'] . $path; if ($this->fileManager->isFile($customPath)) { return $customPath; } $moduleName = null; if ($params->getScope()) { $moduleName = $this->metadata->getScopeModuleName($params->getScope()); } if ($moduleName) { $modulePath = str_replace( '{*}', $moduleName, $this->paths['modulePath'] . $path ); if ($this->fileManager->isFile($modulePath)) { return $modulePath; } } $corePath = $this->paths['corePath'] . $path; if ($this->fileManager->isFile($corePath)) { return $corePath; } return null; } }