infrajs / path
Resolve paths on the file system. Provide point of view on form of paths to files and folders..
Installs: 3 020
Dependents: 51
Suggesters: 0
Security: 0
Stars: 0
Watchers: 2
Forks: 0
Open Issues: 1
Requires
- infrajs/nostore: ~1
- dev-master
- v1.1.34
- v1.1.33
- v1.1.32
- v1.1.31
- v1.1.30
- v1.1.29
- v1.1.28
- v1.1.27
- v1.1.26
- v1.1.25
- v1.1.24
- v1.1.23
- v1.1.22
- v1.1.21
- v1.1.20
- v1.1.19
- v1.1.18
- v1.1.17
- v1.1.16
- v1.1.15
- v1.1.14
- 1.1.13
- 1.1.12
- 1.1.11
- 1.1.10
- 1.1.9
- 1.1.8
- 1.1.7
- 1.1.6
- 1.1.5
- 1.1.4
- 1.1.3
- 1.1.2
- 1.1.1
- 1.1.0
- 1.0.11
- 1.0.10
- 1.0.9
- 1.0.8
- 1.0.7
- 1.0.6
- 1.0.5
- 1.0.4
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
This package is auto-updated.
Last update: 2024-10-14 08:31:11 UTC
README
Принципы и порядок работы с адресом
- Корнем проекта является папка с
vendor/
иcomposer.json
- Адрес записывается относительно корня проекта и в данных для браузера, и в данных для сервера. Например, index.html, images/1.jpg
- Слэш в конце означает только папку. Отстутствие слэша в конце означает только файл.
- Используется только прямой слэш - "/"
- Есть предопределённая папка c данными проекта, которая не попадает в репозиторий системы контроля версий, может содержать логин и пароль (credentials) и использоваться для хранения данных формируемых во время работы проекта. Доступна для записи php. По умолчанию адрес папки с данными
data/
. Короткое обозначение - символ "~" - Есть предопределённая папка с кэшем. Папка не загружается в репозиторий. Доступна для записи php. По умолчанию адрес папки с кэшем
cache/
. Короткое обозначение - символ "!" - Есть предопределённые папки библиотек, в которых будет осуществляться поиск файла при наличии в начале адреса символа "-". По умолчанию это одна папка
vendor/infrajs/
но список папок расширяется автоматически или в ручную в каждом отдельном случае. - Адрес записывается в наиболее короткой форме и содержит принятые сокращения "-", "~", "!", если это возможно.
Для разработчиков
- Строку-адрес можно использовать как уникальный идентификатор файла.
- Недопустимо хранение и обработка абсолютных путей и путей содержающих последовательности "../", "./", "//", ""
- Адрес может содержать параметры после "?" в этом случае нужно отдельно выполнять
explode('?', $src, 2)
при использовании в стандартных php функциях для работы с файловой системой. Если бы в коносли было это можно данная команда не приводила бы к ошибкеcd cache/?test=1
и открылась бы папка cache - Функции не меняют форму адреса, используемые в нём символы или его части и если необходимо генерируют только свою часть адреса и следят только за её правильностью.
- Функции исходят из того, что форма получаемого адреса соответствует указанным принципам и не проверяют это.
- Анализ формы строки адреса и её изменение может быть в момент получения адреса от пользователя или от системы незнакомой с указанными принципами.
- Работа с файловой системой на запись не должна выполняться при наличии ключа
Path::$conf['fs'] = false
. Зависимости работающие с системой учитывают этот ключ. Если зависимая библиотека не может работать без файловой системы, то, например, генерируется обычное исключение... throw new \Exception('Я не могу работать без файловой системы'); - Рабочей дирректорией в файлах php, где бы они не находились, является корень проекта. Рабочая директория устанавливается с помощью
chdir()
. Скрипт не полагается на своё фактическое расположение и содержит проверку своего расположения по файлуvendor/autoload.php
для случае подключения этого скрипта, вместо прямого вызова. - Перед использование адреса в стандартных php-функциях работающих с файловой системой необходимо пропускать адрес через
$src=Path::theme($src)
. Функция проверяет наличие указанного файла или папки и возвращает адрес без специальных сокращений. Использовать в стандартных функция можно путь, который эта функция вернула. Path::theme выполняет роль стандартных is_file is_dir file_exists. Папка или файл определяется наличием слэша в конце адреса. - Для удаление специальных символов "-", "~", "!" из адреса без обращения к файловой системе предназначена функция
$src=Path::resolve($src)
для спецсимвола "-" выполнить эту операцию невозможно, будет сгенерировано исключение.
Проверка и установка рабочей директории
if (!is_file('vendor/autoload.php')) { chdir('../../../'); //Согласно фактическому расположению файла } //Подключаемый скрипт из корня может работать без autoload.php и правильная рабочая дирректория не гарантирует что autoload.php уже подключен require_once('vendor/autoload.php');
Требуется настройка modrewrite в .htaccess
Все запросы для которых нет файла перенаправляются на обработчик vendor/infrajs/path/router.php
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ vendor/infrajs/path/router.php [L,QSA]
Если сайт использует сторонний контроллер и перенаправлять все запросы нельзя нужно настроить более точное условие и перенаправлять на обработчик только запросы начинающиеся со специальных символов [-~!] TODO: добавить код точной переадресации
Path конфиг
В Path::$conf
указывается куда ведут принятые сокращения "-", "~", "!":
- где искать скрипты - search (-),
- где папка данных - data (~),
- где папка кэша - cache (!).
По умолчанию Path::$conf:
{ "data": "data/", "cache": "cache/", "space": false, "fs": true, "search":[ "vendor/infrajs/" ], "clutch": {} }
Параметр space
Нужен для совместимости, когда функция Path::encode не должна заменять пробелы на дифисы.
Расширяемость расширений - clutch
Одно расширение, может содержать файлы для подмены другого расширения
Конфиг расширения cart может содержать такой конфиг и вложенные папки pixeden-stroke-7-icon и cart.
"clutch":{ "catalog":"vendor/infrajs/cart/", "pixeden-stroke-7-icon":[ "vendor/grimmlink/", "vendor/infrajs/cart/" ] }
Файл "-catalog/some.php" возьмётся из папки vendor/infrajs/cards/catalog/some.php если такой файл там будет иначе будет использоваться файл vendor/infrajs/catalog/some.php
При разрешении адреса начинающегося с символа "-" корень проекта имеет наивысший приоритет, за которым следует папка с данными "~" и затем идут папки conf.search
начиная с последней. Первый путь в conf.search
имеет наименьший приоритет.
С помощью clutch можно "подмешать" к стороннему расширению новые файлы или подменить существующие, например добавить конфигурационый файл .infra.json с настройками авторматической интеграции расширения в систему infrajs/collect.
Так как расширение pixeden-stroke-7-icon стороннего производителя и не содержит конфигурационного файла .infra.json нужно ещё и на него явно указать чтобы оно участвовало в поиске файлов (-)
Примеры
site.ru/~mypic.jpg
- указывает на файлsite.ru/data/mypic.jpg
site.ru/-path/test.jpg
- указывает на файлsite.ru/vendor/infrajs/path/test.jpg
Синоним корня index/
site.ru/-index/test.html
- указывает на файлsite.ru/test.html
DirectoryIndex
Если адресная строка содержит путь к -папке/, ищутся файлы index.php или index.html. Если файлов нет, то путь до папки будет считаться 404 ошибкой.
API
$query = Path::init(); //$query содержит запрос для которого не нашлось решения иначе выполнится exit; echo Path::theme('~mypic.jpg'); //если файл есть "data/mypic.jpg" иначе false echo Path::resolve('~mypic.jpg'); //всегда "data/mypic.jpg" Path::req('-path/file.php'); //Аналог require_once с поддержкой спецсимволов Path::reqif('-path/file.php'); //Не приводит к ошибке если файл отсутствует echo Path::toutf($str); //Конвертирует строку в кодировку UTF-8 echo Path::tofs($str); //Конвертирует строку в кодировку файловой системы cp1251 под windows, depricated, используется при использовании кирилицы вименах файлов echo Path::encode($str); //Ковертирует строку в последовательность которую можно использовать в имени файла и в адресной строке - удаляются запрещённые символы echo Path::getExt($str); //Возвращает расширение файла echo Path::mkdir($str); //Создать папку если fs:true echo Path::isdir($str); echo Path::getQuery();//Возвращает текущий запрос echo Path::pretty('data/mypic.jpg'); //антоним resolve. Результат "~mypic.jpg" Path::fullrmdir($path, $sefldelete); //Очищает дирректорию и если второй аргумент true то дирректория удаляется
Path выполняет узкий набор функций по нахождению файлов и декларации правил работы с адресом.
Для обработки запросов вида /contacts
/about
используется отедльное расширение infrajs/controller.