以前、Zendを使ってZip圧縮という記事を書きましたが、今回は逆のZendを使ってZip解凍についてです。
前回は、Zend_Filter_Compressというクラスを使いましたが、今回はZend_Filter_Decompressというクラスを使います。
使い方は以下です。
$filter = new Zend_Filter_Decompress('Zip');
$filter->setArchive('圧縮ファイルのパス付ファイル名')
->setTarget('圧縮ファイルの解凍先ディレクトリパス');
$filter->filter('hoge'); // hogeはnullじゃなければ何でもいいです。
または
$filter = new Zend_Filter_Decompress('Zip');
$filter->setTarget('圧縮ファイルの解凍先ディレクトリパス');
$filter->filter('圧縮ファイルのパス付ファイル名');
または
$filter = new Zend_Filter_Decompress(array(
'adapter' => 'Zip',
'options' => array(
'archive' => '圧縮ファイルの解凍先ディレクトリパス',
'target' => '圧縮ファイルの解凍先ディレクトリパス'
)
));
$filter->filter('hoge'); // hogeはnullじゃなければ何でもいいです。
または
$filter = new Zend_Filter_Decompress(array(
'adapter' => 'Zip',
'options' => array('target' => '圧縮ファイルの解凍先ディレクトリパス')
));
$filter->filter('圧縮ファイルのパス付ファイル名');
または
$filter = new Zend_Filter_Decompress();
$filter->setAdapter('Zip')
->setAdapterOptions(array(
'archive' => '圧縮ファイルの解凍先ディレクトリパス',
'target' => '圧縮ファイルの解凍先ディレクトリパス'))
->filter('hoge'); // hogeはnullじゃなければ何でもいいです。
解凍、圧縮共に Zip の部分を Gz, Lzf, Rar, Tar, Bz2 に変更するとそれぞれの形式で圧縮解凍ができます。
今回疑問に思ったのは(何で前回思わなかったのか。。)、なんで、こんな感じでかけないのかということ。
$filter = new Zend_Filter_Decompress('Zip');
$filter->setArchive('圧縮ファイルのパス付ファイル名')
->setTarget('圧縮ファイルの解凍先ディレクトリパス');
->filter();
または
$filter = new Zend_Filter_Decompress('Zip');
$filter->setTarget('圧縮ファイルの解凍先ディレクトリパス');
->filter('圧縮ファイルのパス付ファイル名');
不思議に思ってプログラムを観てみると、setTargetとかsetArchiveから返ってきているオブジェクトが、Zend_Filter_Decompressではなくて、Zend_Filter_Decompress内部で持っているZip処理のアダプターZend_Filter_Compress_Zipでした。
Zend_Filter_Compress_Zipにはfilterっていうメソッドはないので、エラーがでてたんですね。
Zend_Filter_Decompressの中で、
public function __call($method, $options)
{
$adapter = $this->getAdapter();
if (!method_exists($adapter, $method)) {
require_once 'Zend/Filter/Exception.php';
throw new Zend_Filter_Exception("Unknown method '{$method}'");
}
return call_user_func_array(array($adapter, $method), $options);
}
ってなっている部分を
public function __call($method, $options)
{
$adapter = $this->getAdapter();
if (!method_exists($adapter, $method)) {
require_once 'Zend/Filter/Exception.php';
throw new Zend_Filter_Exception("Unknown method '{$method}'");
}
call_user_func_array(array($adapter, $method), $options);
return $this;
}
ってしたら、やりたい書き方ができそうだけど、どんな弊害があるのかは細かく調べてないのでわかりません。ざっとみたところなさそう。アダプター使いたいなら、getAdapterで取得できるので、不具合もなさそう。なんで、アダプターを返すような作りにしたんだろう?読み取れてない意図があるのかな。