为了应用程序的多功能性和可移植性,所有涉及项目中文件和目录路径引用的操作都必须相对于其根目录。
在HLEB2框架中,文件路径管理由Path服务处理。 它通过提供对相应PHP函数的封装,使项目中相对文件路径的操作变得更加方便。
在控制器中使用Path(以及从Hleb\Base\Container继承的所有类)的示例,通过该示例可以从根目录获取完整路径:
在应用程序代码中定义文件路径的示例:
还可以通过依赖注入并使用Hleb\Reference\Interface\Path接口来获取Path对象。
为简化示例,接下来的示例仅包含通过Hleb\Static\Path的使用。
在上面的示例中,相对路径的开头有一个 '@' 符号。它表示路径从项目的根目录开始。
如果项目的根目录是 /var/www/hleb/,则示例将返回字符串 '/var/www/hleb/storage/public/files'。
在 Windows 上,结果会略有不同,但它仍然是指向指定文件夹的有效完整路径。
前缀 '@storage' 在框架中是预定义的。以下是其他指定映射的列表:
'@' - 项目使用 HLEB2 框架的根目录。
路径可以随意指定,例如 '@/other/folder'。
'@app' - 项目 /app/ 文件夹的路径。
'@public' - 项目 /public/ 文件夹的路径,存放公共项目文件,Web 服务器指向此文件夹。
即使更改了名称,它仍然会对应 '@public'。
'@storage' - 项目 /storage/ 文件夹的路径,用于存储缓存、日志和其他辅助文件。
'@resources' - 项目 /resources/ 文件夹的路径。
该文件夹包含项目的各种资源:页面模板、邮件模板、构建模板等。
'@views' - 项目 /resources/views/ 文件夹的路径。
'@modules' - 项目 /modules/ 文件夹的路径,即使模块目录名称在设置中已更改。
'@vendor' - 项目的库文件夹的路径,即使文件夹名称不同,它仍然保持不变。
因此,项目内的任何路径都是允许的,因此即使在具有不同目录结构的服务器上转移或移动到另一个文件夹也不会成为问题,因为路径总是会指向正确的位置。
Path 服务有几个方法可以正确识别以 '@' 开头的相对路径。
对于带有相对路径的字符串,例如 '@storage/logs/',末尾的斜杠是有意义的。在这种情况下,方法返回的完整路径将包括末尾的斜杠。
getReal() 方法在上面的示例中可以看到。
它返回从相对路径派生的完整路径字符串。
如果指定的路径不存在,该方法返回 false。
框架函数 hl_realpath() 以同样的方式工作。
get() 方法与 getReal() 的不同之处在于即使路径不存在,它也会返回完整路径的字符串,而不检查存在性。
函数 hl_path() 可用作该方法的替代。
该方法与 Path 服务的其他方法不同,它接受完整路径并返回以 '@' 开头的相对路径。 有时需要在项目日志或其他地方输出相对路径,以隐藏完整路径。 relative() 方法在这种情况下非常有用。
示例显示了获取当前文件相对路径的过程。
createDirectory() 方法通过指定的相对路径(以 '@' 开头)或完整路径创建一个目录(如果不存在),包括所有嵌套的子文件夹。
exists() 方法用于检查文件或目录是否存在。
它接受完整路径和以 '@' 开头的相对路径。
框架函数 hl_file_exists() 具有类似的作用。
contents() 方法是 file_get_contents() 的包装,但除了接受完整路径以外,还可以接受以 '@' 开头的相对路径。
框架函数 hl_file_get_contents() 也能实现这个方法。
该方法类似于 file_put_contents() 函数。
除了完整路径之外,put() 方法还接受以 '@' 开头的相对路径。
框架函数 hl_file_put_contents() 可替代使用这个方法。
isDir() 方法是 is_dir() 函数的包装,它可以接受完整路径和以 '@' 开头的相对路径。
可以使用函数 hl_is_dir() 代替这个方法。
某些文件操作,如写入文件,对于异步调用是阻塞的,因此建议使用它们的支持异步的替代方法。
← 日志记录 数据库服务 →