/**
  * Метод возвращает экземпляр класса-хранилища экземпляров фолдинов.
  * Для переопределения этого класса, на уровне проектного 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();
 }
Example #2
0
 /**
  * В конструкторе пробежимся по всем хранилищам и соберём все фолдинги
  */
 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());
     }
 }
Example #3
0
 public static function foldingsAbs()
 {
     return isset(self::$abs) ? self::$abs : (self::$abs = DirManager::relToAbs(self::foldingsRel()));
 }