/** * Метод возвращает экземпляр класса-хранилища экземпляров фолдинов. * Для переопределения этого класса, на уровне проектного config.ini * должен быть задан другой класс. * * @return FoldedStorageInsts */ protected static final function inst() { if (isset(self::$inst)) { return self::$inst; //---- } /* * Получим название класса */ $class = FoldingsIni::foldingsStore(); /* * Класс совпадает с базовым */ if (__CLASS__ == $class) { return self::$inst = new FoldedStorageInsts(); } /* * Нам передан класс, который отличается от SDK */ $classPath = Autoload::inst()->getClassPath($class); if (!PsCheck::isNotEmptyString($classPath)) { return PsUtil::raise('Не удалось найти класс регистрации экземпляров фолдингов [{}]', $class); } /* * Указанный класс должен быть наследником данного */ if (!PsUtil::isInstanceOf($class, __CLASS__)) { return PsUtil::raise('Указанный класс регистрации экземпляров фолдингов [{}] не является наследником класса [{}]', $class, __CLASS__); } return self::$inst = new $class(); }
/** * В конструкторе пробежимся по всем хранилищам и соберём все фолдинги */ protected function __construct() { $this->LOGGER = PsLogger::inst(__CLASS__); $this->PROFILER = PsProfiler::inst(__CLASS__); $this->PROFILER->start('Loading folding entities'); /* * Пробегаемся по всему, настроенному в foldings.ini */ foreach (FoldingsIni::foldingsRel() as $foldedUnique => $dirRelPathes) { $this->FOLDING_2_ENTITY_2_ENTABSPATH[$foldedUnique] = array(); $this->FOLDING_2_ENTITY_2_ENTRELPATH[$foldedUnique] = array(); /* * Загрузим карту сущностей */ foreach (array_unique($dirRelPathes) as $dirRelPath) { $dm = DirManager::inst($dirRelPath); foreach ($dm->getSubDirNames() as $entity) { //Не будем проверять наличие этой сущности, более поздние смогут её переопределить //array_key_exists($entity, $this->FOLDING_2_ENTITY_2_ENTABSPATH[$foldedUnique]) $this->FOLDING_2_ENTITY_2_ENTABSPATH[$foldedUnique][$entity] = $dm->absDirPath($entity); $this->FOLDING_2_ENTITY_2_ENTRELPATH[$foldedUnique][$entity] = $dm->relDirPath($entity); } } ksort($this->FOLDING_2_ENTITY_2_ENTABSPATH[$foldedUnique]); ksort($this->FOLDING_2_ENTITY_2_ENTRELPATH[$foldedUnique]); /* * Построим карты сущностей к типам фолдингов, чтобы мы могли через них выйти на фолдинг */ self::extractFoldedTypeAndSubtype($foldedUnique, $ftype, $fsubtype); /* * Построим карту отношения идентификатора фолдинга к коду ресурса * slib => lib-s */ $this->SOURCE_2_FOLDING[$fsubtype . $ftype] = $foldedUnique; /* * Построим карту отношения идентификатора фолдинга к префиксу класса * SLIB_ => lib-s */ $this->CLASSPREFIX_2_FOLDING[strtoupper($fsubtype . $ftype) . '_'] = $foldedUnique; /* * Построим карту отношения типа фолдинга к массиву подтипов фолдингов * lib => array('s', 'p') * pl = > null */ if (array_key_exists($ftype, $this->TYPE_2_STYPE)) { //Если мы второй раз попали в этот блок для типа фолдинга, то он должен иметь подтип [lib=>array('s')]. check_condition(is_array($this->TYPE_2_STYPE[$ftype]), "Уже зарегистрирован фолдинг с типом [{$ftype}] без подтипов"); $this->TYPE_2_STYPE[$ftype][] = check_condition($fsubtype, "Уже зарегистрирован фолдинг с типом [{$ftype}] и с подтипами"); } else { if ($fsubtype) { //Новый тип фолдинга с подтипом. $this->TYPE_2_STYPE[$ftype] = array($fsubtype); } else { //Новый тип фолдинга без подтипа. $this->TYPE_2_STYPE[$ftype] = null; } } } //Отсортируем по уникальным кодам фолдингов ksort($this->FOLDING_2_ENTITY_2_ENTABSPATH); ksort($this->FOLDING_2_ENTITY_2_ENTRELPATH); ksort($this->TYPE_2_STYPE); //Установим идентификаторы фолдингов $this->FOLDINGS = array_keys($this->FOLDING_2_ENTITY_2_ENTRELPATH); $sec = $this->PROFILER->stop(); if ($this->LOGGER->isEnabled()) { $this->LOGGER->info('FOLDINGS: {}', print_r($this->FOLDINGS, true)); $this->LOGGER->info('FOLDING_2_ENTITY_2_ENTABSPATH: {}', print_r($this->FOLDING_2_ENTITY_2_ENTABSPATH, true)); $this->LOGGER->info('FOLDING_2_ENTITY_2_ENTRELPATH: {}', print_r($this->FOLDING_2_ENTITY_2_ENTRELPATH, true)); $this->LOGGER->info('TYPE_2_STYPE: {}', print_r($this->TYPE_2_STYPE, true)); $this->LOGGER->info('CLASSPREFIX_2_FOLDING: {}', print_r($this->CLASSPREFIX_2_FOLDING, true)); $this->LOGGER->info('SOURCE_2_FOLDING: {}', print_r($this->SOURCE_2_FOLDING, true)); $this->LOGGER->info('BUILDING_TIME: {} sec', $sec->getTotalTime()); } }
public static function foldingsAbs() { return isset(self::$abs) ? self::$abs : (self::$abs = DirManager::relToAbs(self::foldingsRel())); }