Przeglądaj źródła

Added an event that runs before the archive is saved or output.

Ne-Lexa 8 lat temu
rodzic
commit
a1da1f0069
2 zmienionych plików z 57 dodań i 3 usunięć
  1. 15 3
      src/PhpZip/ZipFile.php
  2. 42 0
      tests/PhpZip/ZipEventTest.php

+ 15 - 3
src/PhpZip/ZipFile.php

@@ -610,7 +610,8 @@ class ZipFile implements ZipFileInterface
         \Iterator $iterator,
         $localPath = '/',
         $compressionMethod = null
-    ) {
+    )
+    {
         $localPath = (string)$localPath;
         if (null !== $localPath && 0 !== strlen($localPath)) {
             $localPath = rtrim($localPath, '/');
@@ -694,7 +695,8 @@ class ZipFile implements ZipFileInterface
         $localPath = '/',
         $recursive = true,
         $compressionMethod = null
-    ) {
+    )
+    {
         $inputDir = (string)$inputDir;
         if (null === $inputDir || 0 === strlen($inputDir)) {
             throw new InvalidArgumentException('Input dir empty');
@@ -789,7 +791,8 @@ class ZipFile implements ZipFileInterface
         $localPath = "/",
         $recursive = true,
         $compressionMethod = null
-    ) {
+    )
+    {
         $regexPattern = (string)$regexPattern;
         if (empty($regexPattern)) {
             throw new InvalidArgumentException("regex pattern empty");
@@ -1311,6 +1314,8 @@ class ZipFile implements ZipFileInterface
      */
     protected function writeZipToStream($handle)
     {
+        $this->onBeforeSave();
+
         $output = new ZipOutputStream($handle, $this->zipModel);
         $output->writeZip();
     }
@@ -1332,6 +1337,13 @@ class ZipFile implements ZipFileInterface
         return $content;
     }
 
+    /**
+     * Event before save or output.
+     */
+    protected function onBeforeSave()
+    {
+    }
+
     /**
      * Close zip archive and release input stream.
      */

+ 42 - 0
tests/PhpZip/ZipEventTest.php

@@ -0,0 +1,42 @@
+<?php
+
+namespace PhpZip;
+
+class ZipFileExtended extends ZipFile
+{
+    protected function onBeforeSave()
+    {
+        parent::onBeforeSave();
+        $this->setZipAlign(4);
+        $this->deleteFromRegex('~^META\-INF/~i');
+    }
+}
+
+class ZipEventTest extends ZipTestCase
+{
+    public function testBeforeSave()
+    {
+        $zipFile = new ZipFileExtended();
+        $zipFile->openFile(__DIR__ . '/resources/test.apk');
+        self::assertTrue(isset($zipFile['META-INF/MANIFEST.MF']));
+        self::assertTrue(isset($zipFile['META-INF/CERT.SF']));
+        self::assertTrue(isset($zipFile['META-INF/CERT.RSA']));
+        $zipFile->saveAsFile($this->outputFilename);
+        self::assertFalse(isset($zipFile['META-INF/MANIFEST.MF']));
+        self::assertFalse(isset($zipFile['META-INF/CERT.SF']));
+        self::assertFalse(isset($zipFile['META-INF/CERT.RSA']));
+        $zipFile->close();
+
+        self::assertCorrectZipArchive($this->outputFilename);
+        $result = self::doZipAlignVerify($this->outputFilename);
+        if (null !== $result) {
+            self::assertTrue($result);
+        }
+
+        $zipFile->openFile($this->outputFilename);
+        self::assertFalse(isset($zipFile['META-INF/MANIFEST.MF']));
+        self::assertFalse(isset($zipFile['META-INF/CERT.SF']));
+        self::assertFalse(isset($zipFile['META-INF/CERT.RSA']));
+        $zipFile->close();
+    }
+}