Мы создаем структуру папок следующим образом:
/
/index.html
/css
/css/custom.css
/css/vendor/main.css <-- this is a working symbolic like
Теперь мы не хотим упаковывать всю папку в zip-архив. Пока это работает, но это не обрабатывает символические ссылки правильно. В какой-то системе он просто игнорирует их, в другой - вводит абсолютный путь. Как мы можем заставить следовать символической ссылке и скопировать реальный файл в «символьную структуру».
public static function zip_files(Event $event, $source, $destination)
{
$zip = new \ZipArchive();
if ($zip->open($destination, \ZIPARCHIVE::CREATE) === true) {
$source = realpath($source);
if (is_dir($source)) {
$iterator = new \RecursiveDirectoryIterator($source);
$iterator->setFlags(\RecursiveDirectoryIterator::SKIP_DOTS);
$files = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::SELF_FIRST);
foreach ($files as $file) {
$file = realpath($file);
if (is_dir($file)) {
$zip->addEmptyDir(str_replace($source . DIRECTORY_SEPARATOR, '', $file . DIRECTORY_SEPARATOR));
} elseif (is_file($file)) {
$zip->addFile($file, str_replace($source . DIRECTORY_SEPARATOR, '', $file));
}
}
} elseif (is_file($source)) {
$zip->addFile($source, basename($source));
}
}
$event->getIO()->write(sprintf('<info>Created/Updated "%s" in "%s"<info>', $source, $destination));
return $zip->close();
}
Foreach, где мы его называем.
foreach ($archives as $OutputZipName => $RelativeFolderToBeZipped) {
$source = realpath($RelativeFolderToBeZipped);
$fileName = $OutputZipName . '.zip';
$destination = realpath($outputFolder['dir']) . DIRECTORY_SEPARATOR . $fileName;
self::zip_files($event, $source, $destination);
}