infrajs/path

此包的最新版本(v1.1.34)没有可用的许可证信息。

解析文件系统上的路径。提供对文件和文件夹路径形式的观点。

v1.1.34 2021-08-19 10:22 UTC

README

地址的原则和工作顺序

  1. 项目的根是包含 vendor/composer.json 的文件夹
  2. 地址相对于项目根记录,并在浏览器数据和服务器数据中记录。例如,index.html,images/1.jpg
  3. 末尾的斜杠仅表示文件夹。末尾没有斜杠仅表示文件。
  4. 仅使用直接斜杠 - "/"
  5. 有一个预定义的 数据文件夹,它不会进入版本控制系统,可能包含凭据(credentials),并用于在项目工作期间存储数据。它可用于php记录。默认数据文件夹地址为 data/。简称为 "~"
  6. 有一个预定义的 缓存文件夹。文件夹不会加载到版本控制系统中。它可用于php记录。默认缓存文件夹地址为 cache/。简称为 "!"
  7. 有一些预定义的 库文件夹,在地址以符号 "-" 开头时将在此处搜索文件。默认为一个文件夹 vendor/infrajs/,但列表在每种情况下都会自动或手动扩展。
  8. 地址以最简形式记录,并包含如果可能的话接受的缩写 "-"、"~"、"!"。

面向开发者

  1. 可以将地址行用作文件的唯一标识符。
  2. 不允许存储和处理绝对路径和包含 "../"、"./"、"//"、"空" 的路径序列。
  3. 地址可以包含"?"后面的参数,在这种情况下,需要单独执行 explode('?', $src, 2),在标准php文件系统函数中使用时。如果命令行是这样的,那么这个命令不会导致错误 cd cache/?test=1,并且会打开 cache 文件夹。
  4. 函数不改变地址的形式,使用其中的符号或其部分,并且如果需要,仅生成其部分地址并确保其正确性。
  5. 函数假定获得的地址形式符合指定的原则,并不进行检查。
  6. 地址形式的分析和更改可能在获得地址时发生,无论是从用户那里还是从不知道这些原则的系统那里。
  7. 当存在键 Path::$conf['fs'] = false 时,不应执行文件系统上的写入操作。考虑使用系统的依赖项会考虑此键。如果依赖库不能在没有文件系统的情况下工作,则例如,生成常规异常... throw new \Exception('我没有文件系统无法工作');
  8. 无论php脚本在哪里,工作目录都是项目的根目录。使用 chdir() 设置工作目录。脚本不依赖于其实际位置,并包含检查其位置的文件 vendor/autoload.php 的检查,以替代直接调用。
  9. 在使用标准php文件系统函数之前,需要通过 $src=Path::theme($src) 将地址传递。该函数检查指定的文件或文件夹是否存在,并返回没有特殊缩写的地址。可以使用该函数返回的路径。Path::theme 执行标准 is_file is_dir file_exists 的功能。文件夹或文件通过地址末尾是否存在斜杠来确定。
  10. 用于从地址中删除特殊符号 "-"、"~"、"!" 的函数是 $src=Path::resolve($src)。对于 "-" 特殊符号,执行此操作是不可能的,将会抛出异常。

检查和设置工作目录

if (!is_file('vendor/autoload.php')) {
	chdir('../../../'); //Согласно фактическому расположению файла
}
//Подключаемый скрипт из корня может работать без autoload.php и правильная рабочая дирректория не гарантирует что autoload.php уже подключен
require_once('vendor/autoload.php'); 

需要配置 .htaccess 中的 modrewrite

所有没有文件的请求都重定向到处理程序 vendor/infrajs/path/router.php

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ vendor/infrajs/path/router.php [L,QSA]

如果网站使用第三方控制器且不能重定向所有请求,则需要设置更精确的条件,只重定向以特殊符号 [-~!] 开头的请求。TODO:添加精确重定向代码

路径配置

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

根目录的索引同义词

  • site.ru/-index/test.html - 指向文件 site.ru/test.html

DirectoryIndex

如果地址字符串包含指向 -文件夹/ 的路径,则查找 index.phpindex.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