jhofm/flysystem-iterator

该软件包已被废弃且不再维护。作者建议使用 league/flysystem 软件包。

league/flysystem 的迭代插件

v2.2.1 2020-12-25 18:00 UTC

This package is not auto-updated.

Last update: 2020-12-25 18:02:50 UTC


README

弃用

该软件包已被弃用。 league/flysystem v2.0 支持开箱即用的可筛选递归迭代器 out of the box。如果您无法从 v1.x 版本升级,则仍可以使用此插件。

关于

提供创建迭代器的插件,该迭代器遍历 Flysystem\FileSystem 中的路径,支持递归和自定义过滤器。

递归迭代比 Flysystem 的递归 listContents 查找($filesystem->listContents('', true))更节省内存,因为只有当前项目祖先部分所在的目录内容会被保留在内存中。

返回的迭代器是可定位的、可计数的、可 JSON 序列化的。使用这些函数通常需要对文件系统中所有项目进行完全递归。

需求

  • PHP 7.0 - 7.4

安装

可以通过 composer 将库添加到您的项目中。

$ composer require jhofm/flysystem-iterator

快速入门

use Jhofm\FlysystemIterator\Plugin\IteratorPlugin;
use League\Flysystem\Adapter\Local as LocalAdapter;
use League\Flysystem\Filesystem;
use Jhofm\FlysystemIterator\Filter\FilterFactory;

$fs = new Filesystem(
    new LocalAdapter(
        '/home/user',
        LOCK_EX,
        LocalAdapter::SKIP_LINKS
    )
);
$fs->addPlugin(new IteratorPlugin());

$iterator = $fs->createIterator(
    ['filter' => FilterFactory::isFile()],
    'subdirectory'
);

foreach ($iterator as $key => $item) {
    echo $i . ' ' . $item['path'] . "\n";
}
var_dump(json_encode($iterator));

配置选项

可以通过传递一个键/值配置数组到插件来控制迭代器的行为。Options\Options 类中存在所有可用选项键和字符串值的常量。

默认情况下启用迭代器递归,可以通过传递

'recursive' => false

当递归被启用时,迭代器返回的第一个值将是迭代的目录。要忽略根目录并从目录内容开始迭代,可以传递参数

'skip-root' => true

如果递归被禁用,此参数将没有效果。

迭代器将返回一个数值索引作为键,以及 listContents() 返回的当前项的文件信息数组。

可以通过向配置数组传递附加属性数组将附加的文件系统元数据添加到项中。允许的属性名称与 Flysystem 的 ListWith 插件中相同。

'list-with' => 'mimetype'

或者,可以返回当前项的路径,相对于正在迭代的目录,而不是信息数组。与文件系统信息数组中的路径不同,目录将有尾部斜杠,因此可以在没有类型信息的情况下区分文件和目录。

'value' => 'path'

迭代器返回的路径可以通过传递一个过滤闭包来过滤。当前列表项将被传递给过滤函数。如果闭包返回true,则该元素将被包含在结果中。以下示例仅返回大小为1kb或更大的文件(目录将被跳过)。

[
    'filter' =>
        function(array $item) {
            return $item['type'] === 'file' 
            && $item['size'] >= 1024;
        }
]    

包含了一个过滤器工厂,它提供了一些现成的过滤器回调函数,包括布尔包装器。

[
    'filter' =>
        FilterFactory::and(
            FilterFactory::isDirectory(),
            FilterFactory::pathContainsString('foo')
        )

可以将子目录指定为createIterator()函数的第二个可选参数。如果省略,迭代器将使用文件系统适配器设置的目录。

已知问题

  • 过滤器无法与路径返回值一起使用