【EC-CUBE3】自作したプラグインのアップロードに失敗する場合の対処法

先日、EC-CUBE3向けのプラグインを作成した後、
いざ、プラグインをアップロードして組み込もうとした時に
「アップロードに失敗しました。圧縮ファイルを確認してください。」という謎の不具合に遭遇し、
色々悩んだことがありましたので、備忘録を兼ねて、その時の事を書き残しておきたいと思います。

ec-cubeプラグインエラー

この現象、以前から時々、発生していたのですが、
プログラムを作り直していくうちに知らない間に解消されていたので、
特に気にせず、放置していたのですが、
今回はプラグインが完成した状態で発生した為、原因を調査してみました。

結論から言うと、tar.gzファイルを解凍する処理にて、
圧縮ファイルが壊れていて、解凍できないというエラーが内部的に発生していました。
(EC-CUBE3.0.12時点では、/src/Eccube/Service/PluginService.php 116行付近でExceptionが発生していました)

不思議な事にプラグインパッケージ内のEntity用フォルダ内に
ファイルを2つ以上用意するとエラーが解消されアップロードが完了するという状況でした。

※この時はOK
ec-cubeプラグインエラーOK
※この時はNG
ec1

しかも2つ目のファイルは、内容やファイル名はどんなものでもOKだったようで
とにかくファイルがあるという事が重要だったようです。
ただ、配布するプラグインパッケージに不要なファイルを含めるというのは
余計な問題を起こす元となる為、できれば削除したいと思い、
フォルダ構造を1から作り直して、ソースファイルだけコピーし直すという作業を行い、
再圧縮すると問題無く、アップロードされるようになりました。

圧縮ソフトの原因かどうかの切り分けは定かではありませんが、
もし、同じような現象に遭遇された方は、面倒でも一からフォルダ構造だけ新しく作り直してみてください。

それでも上手くいかない場合は、上記のExceptionが発生している箇所を無理やり書き直して、
Exception->getMessageを出力してみるといいかもしれませんね。

public function unpackPluginArchive($archive, $dir)
{
$extension = pathinfo($archive, PATHINFO_EXTENSION);
try {
if ($extension == ‘zip’) {
$zip = new \ZipArchive();
$zip->open($archive);
$zip->extractTo($dir);
$zip->close();
} else {
$phar = new \PharData($archive);
$phar->extractTo($dir, null, true);
}
} catch (\Exception $e) {
print_r($e->getMessage());
exit;

throw new PluginException(‘アップロードに失敗しました。圧縮ファイルを確認してください。’);
}
}

catch内に、print_rとexitを追加しています。
ここは結果が表示されれば、どんな書き方でも良いと思いますが、
最後、書き直す事を忘れないように注意してください。