addFolders($folderList); } } public function addFolder(string $folder, int $order = 100) : void { $folder = $this->normalizeFolder($folder); $this->folderList[$folder] = [ 'path' => $folder, 'order' => $order, ]; } public function addFolders(array $folderList) : void { foreach($folderList as $folder) { $this->addFolder($folder['path'], $folder['order']); } } protected function normalizeFolder(string $path) : string { return rtrim($path, '/\\'); } public function folderList(?array $set = null) : ?array { return $set === null ? $this->folderList : $this->folderList = $set; } public function findFile(string $fileName) : string { usort($this->folderList, fn($a, $b) => $a['order'] <=> $b['order']); foreach($this->folderList() as $folder) { foreach($this->supportedExtensionList as $extension) { $file = $folder['path'] . DIRECTORY_SEPARATOR . "$fileName.$extension"; $file = str_replace([ '\\', '/' ], DIRECTORY_SEPARATOR, $file); if ( file_exists($file) ) { if ( is_dir($file) ) { throw new \RuntimeException("Given view file `$fileName` is a folder, you must provide a valid filename."); } return $file; } } } # Fallback on full-path foreach($this->folderList() as $folder) { $file = $folder['path'] . DIRECTORY_SEPARATOR . $fileName; $file = str_replace([ '\\', '/' ], DIRECTORY_SEPARATOR, $file); if ( file_exists($file) ) { if ( is_dir($file) ) { throw new \RuntimeException("Given view file `$fileName` is a folder, you must provide a valid filename."); } return $file; } } throw new \RuntimeException("Given view file `$fileName` can not be found within given folder list.."); } public function getFileList() : array { usort($this->folderList, fn($a, $b) => $a['order'] <=> $b['order']); $list = []; foreach($this->folderList() as $folder) { $path = $folder['path'] . "/"; $list[$path] = []; if ( \file_exists($path) ) { $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::SELF_FIRST, RecursiveIteratorIterator::CATCH_GET_CHILD); foreach ($iterator as $file) { if ($file->isFile() && in_array($file->getExtension(), $this->supportedExtensionList)) { $list[$path][] = $file; } } } } return $list; } public function getFilePath(string $fileName) : string { return $this->findFile($fileName); } public function getFileContent(string $fileName) : string { return file_get_contents($this->getFilePath($fileName)); } }