public static function init() { Once::exec(__FILE__, function () { //Список операций выполняющихся при любом запросе со спецсимволом в адресе [-~!] и при запросах без файлов //или при яном вызове в скрипте Router::init(); //Собирается конфиг .infra.json из корня проекта //Теперь при первом обащении к классу расширения будет собираться его конфиг .infra.json из папки расширения Config::init(); //Анализируется папка vendor Находятся все производители поддерживающие конфигурационные файлы .infra.json //Некий производитель angelcharly попадёт в список поиска, если у него есть библиотека с файлом .infra.json //Эту обработку можно убрать если производители прописаны вручную в config.path.search проекта //Без этой обработке, например, переопределения в кореновм .infra.json для расширения weather //не применятся к Weather::$conf и неinfrajs расширения будет работать со значениями по умолчанию //.infra.json в самих неinfrajs расширениях также не будет прочитан, //но значения конфига по умолчанию и так указаны в переменной класса, вроде Weather::$conf по этому не скажется на работе //В общем заполняем config.path.search путями до установленных расширений Search::init(); //Автоматическая установка расширений //Cоздаются папка cache и для расширения mem создаётся папка cache/mem, если их нет //Наличие этих папок, например, обязательно для Search, который кэширует свою работу //Во время обновления запускаются тесты Update::init(); //По дате авторизации админа выход и если браузер прислал информацию что у него есть кэш //Заголовок Cache-control:no-store в расширении Nostore::on() запретит создавать кэш, если станет ясно, что modfeied не нужен Access::modified(); //Заголовки по умолчанию для Cache-Controll Nostore::init(); //Вспомогательные заголовки с информацией о правах пользователя test debug admin Access::headers(); }); }
<?php use infrajs\path\Path; use infrajs\ans\Ans; use infrajs\config\search\Search; if (!is_file('vendor/autoload.php')) { chdir('../../../'); require_once 'vendor/autoload.php'; } Search::init(); $ans = array(); $ans['search'] = Path::$conf['search']; if (sizeof(Path::$conf['search']) == 1 && is_dir('vendor/ded/')) { //$ans['class']='bg-warning'; return Ans::err($ans, 'Только одна папка поиска - ' . print_r(Path::$conf['search'], true) . ', такое может быть ещё для пустого проекта. Как минимум должен быть найден vendor/ded c domready'); } return Ans::ret($ans);
public static function checkFS() { $search = Cache::exec(array('composer.lock'), __FILE__ . 'init', function () { $search = array(); $ex = array_merge(array(Path::$conf['cache'], Path::$conf['data']), Path::$conf['search']); Search::scan('', function ($src, $level) use(&$search, $ex) { if (in_array($src, $ex)) { return true; } //вглубь не идём if ($level < 2) { return; } if ($level > 5) { return true; } if (!is_file($src . '.infra.json')) { return; } $r = explode('/', $src); array_pop($r); array_pop($r); $search[] = implode('/', $r) . '/'; return false; //вглубь не идём и в соседние папки тоже }); return $search; }); Path::$conf['search'] = array_values(array_unique(array_merge(Path::$conf['search'], $search))); if (Config::$all) { //Если все конфиги были уже обраны, нужно заного пробежаться по найденным for ($i = 0; $i < sizeof($search); $i++) { $tsrc = $search[$i]; if (!is_dir($tsrc)) { continue; } $files = scandir($tsrc); foreach ($files as $file) { if ($file[0] == '.') { continue; } if (!is_dir($tsrc . $file)) { continue; } Config::load($tsrc . $file . '/.infra.json', $file); } } } /*$comp = Load::loadJSON('composer.json'); if ($comp && !empty($comp['require'])) { foreach ($comp['require'] as $n => $v) { $r = explode('/', $n); if (sizeof($r) != 2) continue; $path = 'vendor/'.$r[0].'/'; if (!in_array($path, Path::$conf['search'])){ Path::$conf['search'][] = $path; } } }*/ }