ArchiveCreator.php 2.97 KB
<?php
/**
 * Created by PhpStorm.
 * User: Tsurkanov
 * Date: 03.11.2015
 * Time: 14:51
 */

namespace common\components\archives;


/**
 * Class ArchiveCreator
 * @package common\components\archives
 * фабрика по созданию объектов ArchiveReader
 */
class ArchiveCreator {

    //@todo - переделать на автоматическое определние поддерживаемых расширений и создание архиватора динамически из имени расширения
    // сейчас не работает, так как class_exists( $arh_class ) - неработает. Класс не лоадится почему-то
    // так-же смежная проблема - классов ридеров нет в get_declared_classes()
    /**
     * @var array - массив поддерживаемых расширений
     */
    protected  $handleExtension = ['rar', 'zip'];

    /**
     * @param $file - имя файла для распаковки
     * @param $ext - расширение файла для распаковки
     * @return экземпляр ArchiveReader
     * @throws \Exception
     */
    public  function create( $file, $ext ){
//        if ( $this->isHandleableExtension( $ext )) {
//            $arh_class = ucfirst( $ext ) . 'ArchiveReader';
//            if ( class_exists( $arh_class ) ) {
//
//                $arh_reader =  new $arh_class();
//
//                if ($arh_reader instanceof ArchiveReader ) {
//                    $arh_reader->open($file);
//                    return $arh_reader;
//                }
//
//            }
//
//        }
        if ( $ext  == 'zip' ) {
            $arh_reader =  new ZipArchiveReader();
        }elseif( $ext  == 'rar' ){
            $arh_reader =  new RarArchiveReader();
        }


        if( $arh_reader->open( $file ) )
            return $arh_reader;

        // не найден подходящий обработчик
        throw new \Exception( "Для расширения {$ext} не найден подходящий распаковщик" );
    }

    /**
     * проверяет поддерживается ли полученное расширение нашими ридерами
     * @param $ext - расширение, которое нужно проверить
     * @return bool
     */
    protected  function isHandleableExtension( $ext ){

       // $this->setHandleExtension( );
        return (bool) array_search( $ext, $this->handleExtension);
    }

//    protected  function setHandleExtension( ){
//        if ( !$this->handleExtension ) {
//            foreach (get_declared_classes() as $class) {
//                if (is_subclass_of( $class, ArchiveReader::class ))
//
//                    $this->handleExtension[] = $class::getExtension();
//
//            }
//        }
//    }

    public  function getHandleExtension( ){

       // $this->setHandleExtension( );
       return $this->handleExtension;

    }


}