symplify/smart-file-system

该包已被废弃且不再维护。作者建议使用 symfony/filesystem 包。

带有安全 getRealPath() 和其他便捷方法的净化 FileInfo

11.1.26 2023-02-05 13:38 UTC

This package is auto-updated.

Last update: 2023-12-03 20:18:54 UTC


README

Downloads total

安装

composer require symplify/smart-file-system

使用

SplFileInfo 是否存在?

SplFileInfo::getRealPath() 方法返回文件的绝对路径... FALSE,如果文件不存在。默认的 PHP 行为强制您 检查所有 getRealPath() 调用

$fileInfo = new SplFileInfo('non_existing_file.txt');

if ($fileInfo->getRealPath() === false) {
    // damn, the files doesn't exist
    // throw exception or whatever
    // everytime!
}

$fileRealPath = $fileInfo->getRealPath();

虽然这有原因 - 例如,确保文件在构建后未被删除,但实际上我们必须调用该方法来确定文件已被删除。另一个烦恼是告诉静态分析器。

实际上,我们很少处理曾经存在但现在已删除的文件,除非我们有意为之。我们通常使用 SplFileInfo 来修改文件或处理它们的路径。

假设

  • 我们可以解决这个问题,并确保 getRealPath() 方法始终返回字符串
  • 在创建 SplFileInfo 时获取一个非现有文件的异常?

引入 SmartFileInfo

$fileInfo = new Symplify\SmartFileSystem\SmartFileInfo('non_existing_file.txt');
// throws Symplify\SmartFileSystem\Exception\FileNotFoundException

该类还带来了新的有用方法

// current directory (cwd()) is "/var/www"
$smartFileInfo = new Symplify\SmartFileSystem\SmartFileInfo('/var/www/src/ExistingFile.php');

echo $smartFileInfo->getBasenameWithoutSuffix();
// "ExistingFile"

echo $smartFileInfo->getRelativeFilePath();
// "src/ExistingFile.php"

echo $smartFileInfo->getRelativeDirectoryPath();
// "src"

echo $smartFileInfo->getRelativeFilePathFromDirectory('/var');
// "www/src/ExistingFile.php"

它还修复了 Symfony\Component\Finder\SplFileInfo 的 WTF 行为。哪一个?当你运行例如 vendor/bin/ecs check src 并使用 Finder 时,Symfony 现在返回到 src 的所有相对路径。这对于像:vendor/bin/ecs check src tests 这样的多个目录(都包含文件 Post.php)是无用的。

$smartFileInfo = new Symplify\SmartFileSystem\SmartFileInfo('/var/www/src/Post.php');

echo $smartFileInfo->getRelativeFilePathFromCwd();
// "src/Post.php"

文件名匹配

最后但同样重要的是,在排除文件时,文件匹配非常有用(这对于像 ECS、PHPStan、Psalm、Rector、PHP CS Fixer 或 PHP_CodeSniffer 这样的工具来说是典型的)

$smartFileInfo = new Symplify\SmartFileSystem\SmartFileInfo('/var/www/src/PostRepository.php');

echo $smartFileInfo->endsWith('Repository.php');
// true

echo $smartFileInfo->doesFnmatch('*Repo*');
// true

Smart FileSystem - 就像 Symfony,但更好

新方法 - readFile()(用于读取文件)

$smartFileSystem = new Symplify\SmartFileSystem\SmartFileSystem();
$fileContent = $smartFileSystem->readFile(__DIR__ . '/SomeFile.php');
// if you plan to use SmartFileInfo, use this
$smartFileInfo = $smartFileSystem->readFileToSmartFileInfo(__DIR__ . '/SomeFile.php');

将各种文件净化为 SmartFileInfo[]

您有多个可能会混淆的文件输入吗?

$files = [new SplFileInfo('someFile.php')];

$files = [new Symfony\Component\Finder\SplFileInfo('someFile.php', 'someFile', '')];

// or
$files = (new Symfony\Component\Finder\Finder())->files();

// or
$files = ['someFile.php'];

稍后,您实际上想处理这些文件

foreach ($files as $file) {
    // what methods do we have here
    // what kind of object?
    // is it even object or a string?
    $file->...
}

使用净化后的文件,这些文件具有统一的格式,您可以依赖它们

use Symplify\SmartFileSystem\Finder\FinderSanitizer;

$finderSanitizer = new FinderSanitizer();
$smartFileInfos = $finderSanitizer->sanitize($files);

// always array of Symplify\SmartFileSystem\SmartFileInfo
var_dump($smartFileInfos);

报告问题

如果您遇到错误或想请求新功能,请访问 Symplify monorepo 问题跟踪器

贡献

此包的源代码包含在 Symplify monorepo 中。我们欢迎在此 symplify/symplify 上为此包做出贡献。