/** * Публикует ресурс (файл или директорию) * Возвращает публичный URL ресурса * @param string $path * @return string */ public function publish($path) { // Получаем абсолютный путь в ФС до ресурса и узнаем тип ресурса $realPath = $this->getRealPath($path); // TODO: смущает меня этот кусок, если честно. Надо внимательно его перепроверить. foreach ($this->assets as $asset) { if (false !== strpos($realPath, $asset['path'])) { return str_replace(DS, '/', str_replace($asset['path'], $asset['url'], $realPath)); } } $type = is_dir($realPath) ? 'dir' : 'file'; // Получаем время последней модификации ресурса // и, заодно, путь до него и до возможной публикации clearstatcache(true, $realPath); if ('dir' == $type) { $baseRealPath = $realPath; $lastModifiedTime = Helpers::dirMTime($realPath . DS . '.'); } else { $baseRealPath = pathinfo($realPath, PATHINFO_DIRNAME); $baseRealName = pathinfo($realPath, PATHINFO_BASENAME); $lastModifiedTime = filemtime($realPath); } $pathHash = substr(md5($baseRealPath), 0, 12); $assetBasePath = ROOT_PATH_PUBLIC . DS . 'Assets' . DS . $pathHash; $assetBaseUrl = '/Assets/' . $pathHash; // Вариант 1 - такого пути в папке Assets нет if (!is_readable($assetBasePath)) { Helpers::mkDir($assetBasePath); if ('dir' == $type) { Helpers::copyDir($realPath, $assetBasePath); } else { Helpers::copyFile($realPath, $assetBasePath); } } else { // Вариант 2 - нужный путь уже есть, нужно проверить наличие там нашего файла clearstatcache(); if ('file' == $type) { // Файл не найден, копируем его // Файл найден, но протух - перезаписываем if (!is_readable($assetBasePath . DS . $baseRealName) || $lastModifiedTime >= filemtime($assetBasePath . DS . $baseRealName)) { Helpers::copyFile($realPath, $assetBasePath); } } else { // Это папка. Она уже скопирована. Но протухла if ($lastModifiedTime >= filemtime($assetBasePath . DS . '.')) { Helpers::copyDir($realPath, $assetBasePath); } } } $asset =& $this->assets[]; $asset['path'] = $realPath; $asset['url'] = str_replace(DS, '/', str_replace($baseRealPath, $assetBaseUrl, $realPath)); return $asset['url']; }