bushbaby/flysystem

flysystem 文件系统的 Laminas 框架模块桥接器。

8.0.2 2024-03-06 08:25 UTC

README

一个简单的 Laminas 模块,用于桥接 Flysystem 文件系统。

Latest Stable Version Total Downloads License PHP Version Require Test Coverage Status

提供了一种配置由 thephpleague 的 'Flysystem' 提供的各种文件系统适配器的方法。并允许通过名称从 ServiceLocator 中检索完全配置的文件系统。定义的文件系统是本地还是 Dropbox 文件系统成为配置细节。

安装

composer require bushbaby/flysystem

然后,将 BsbFlysystem 添加到 config/application.config.php 模块列表中。

config/bsb_flysystem.local.php.dist 复制到 config/autoload 目录以启动配置。

弃用

迁移到 v8

配置更改

  • 对于适配器配置,'type' 键已被重命名为 'factory'。现在每个适配器都通过其 FQCN 在 'factory' 键中引用。
  • 'options' 现在作为命名参数数组传递给适配器工厂。查看各个适配器构造函数哪些选项可用。某些选项(如 'mimeTypeDetector')可能是一个有效的服务名称。适配器将从服务管理器中获取一个实例。
  • 'shared' 选项已被删除。文件系统和适配器服务都是插件管理器。从 Laminas 插件管理器拉取的具有额外创建选项的服务使用服务管理器的构建方法,因此不是共享的。
  • 'adapter_map' 已被删除。适配器配置现在在 'adapters' 键中完成。'adapter_map' 用于覆盖默认适配器列表。这不再需要,因为默认适配器列表现在是空的。
  • 当然,还要查看 Flysystem 的 API 更改 从 1.x 升级Flysystem V2 & V3 中的新功能

配置

有关 BsbFlysystem 的配置位于顶级配置键 bsb_flysystem 中。

配置包括以下基本元素;

  • 适配器 由文件系统消耗。
  • 文件系统 文件系统在用户空间中消耗。

适配器

要配置适配器,您需要向 bsb_flysystem->adapters 添加一个键,其中包含以下选项的关联数组;

  • factory <string> 用于创建适配器的工厂的 FQCN。
  • options <array> 每个适配器构造函数传递的命名参数(参见 flysystem 或查看 config/bsb_flysystem.local.php.dist)
  • options.prefix <string> (可选)任何文件系统适配器都可以使用 路径前缀 来限制到前缀路径。
  • options.readonly <boolean> (可选)任何文件系统适配器都可以设置为只读 只读适配器

示例:指向 ./data/files 的只读本地适配器

'bsb_flysystem' => [
    'adapters' => [
        'local_files' => [
            'factory' => BsbFlysystem\Adapter\Factory\LocalAdapterFactory::class,
            'options' => [
                'location' => './data/files',
                'readonly' => true,
            ],
        ],
    ],
],

文件系统

通过向 bsb_flysystem->filesystems 添加来配置文件系统。每个文件系统可能包含以下选项:

  • adapter <string> 适配器服务名称。
'bsb_flysystem' => [
    'filesystems' => [
        'files' => [
	        'adapter' => 'local_files',
        ],
    ],
],

可以通过 'adapter_options' 键覆盖传递给适配器工厂的选项。如果您想为多个文件系统使用相同的适配器但具有不同的选项,这非常有用。通常,您会在从插件管理器手动拉取文件系统或适配器时这样做。

AdapterManager

AdapterManager 自动配置,但可以通过 bsb_flysystem->adapter_manager 调整其配置。

特别是,如果使用 Rackspace 适配器,lazy_services 配置键可能很有用。BsbFlysystem 会“懒加载”该适配器。只有在实际使用适配器时才会建立连接。这通过 ProxyManager 完成。由于 Laminas 也使用此库,我们利用应用程序中可能存在的 'lazy_services' 配置。Rackspace 适配器将 Laminas lazy_services 配置键与 adapter_manager lazy_services 配置合并,允许控制 ProxyManager 如何处理它。

'bsb_flysystem' => [
    'adapter_manager' => [
        'config'      => [
        ],
        'lazy_services' => [
            // directory where proxy classes will be written - default to system_get_tmp_dir()
            // 'proxies_target_dir'    => 'data/cache',
            // namespace of the generated proxies, default to "ProxyManagerGeneratedProxy"
            // 'proxies_namespace'     => null,
            // whether the generated proxy classes should be written to disk
            // 'write_proxy_files'     => false,
        ],
    ],
],

使用方法

默认情况下,BsbFlysystem 提供一个预配置的文件系统。这是一个本地文件系统,并公开了默认 Laminas 应用程序的数据目录。此目录配置为具有 'lazyRootCreation'。

文件系统和适配器服务都是 Laminas 插件管理器,存储在全局服务管理器中。已为两者注册别名;BsbFlysystemManager 和 BsbFlysystemAdapterManager。

文件系统管理器

在 simplest 形式中,我们会这样检索文件系统。我们从主服务管理器获取文件系统服务,并从中获取文件系统实例。

示例:获取 'default' 文件系统。在这种情况下,一个 'local' 文件系统,其根为 'data'。

$filesystem = $serviceLocator->get('BsbFlysystemManager')->get('default');
$contents   = $filesystem->read('file.txt');

如果您决定在某个时刻文件需要存储在不同的系统上,您只需重新配置命名文件系统服务以使用不同的适配器服务。无需更改用户空间实现。

适配器管理器

可以通过在主服务定位器中注册的 BsbFlysystemAdapterManager 服务直接访问适配器服务。这对于设置 Mount 文件系统或使用运行时配置很有用。请参阅下面的高级部分。

$adapter    = $serviceLocator->get(\BsbFlysystem\Service\AdapterManager::class)->get('local_data');
$filesystem = new Filesystem($adapter);
$contents   = $filesystem->read('file.txt');

提供的工厂

我已尝试为 Flysystem 中的每个适配器提供工厂(和测试)。每个都附带其自己的必填和可选选项集。请参阅 Flysystem 文档以获取更多信息。

适配器

  • Aws3Sv3
  • AzureBlobStorage
  • Dropbox
  • Ftp
  • GoogleCloudStorage
  • InMemory
  • Local
    • BsbFlysystem 预配置了一个名为 'local_data' 的适配器,以公开 Laminas 应用程序的 ./data 目录。
  • Replicate
  • Sftp
  • WebDAV
  • ZipArchive

关于 AwsS3 适配器的说明;有两个版本的 AwsS3 SDK,并且一次只能安装一个。因此,Aws3S 和 Aws3Sv2 适配器不是必需的 dev-dependancies,并且(目前)未进行单元测试。

文件系统

有一个 FilesystemFactory,它根据配置创建一个文件系统。

高级使用

共享选项和 createOptions

层压服务管理器的一个特性是在每次从服务管理器请求服务实例时(共享与不共享)都能够创建服务实例。为了方便,可以通过将'shared'设置为false/true来实现这一点。结合服务管理器get方法的'createOptions'选项,这可以用来覆盖选项值。

考虑以下配置;根据在运行时检索到的存储访问令牌检索多个配置好的dropbox文件系统。

'adapters' => [
    'dropbox_user' => [
        'type' => 'dropbox',
        'options' => [
            'client_identifier' => 'app_id',
            'access_token'      => 'xxxxx',
        ],
    ],
],
'filesystems' => [
    'dropbox_user' => [
        'shared' => false,
        'adapter' => 'dropbox_user'
    ],
],
$accessTokens = [...];
foreach ($accessTokens as $accessToken) {
    $adapter = $serviceLocator->get(\BsbFlysystem\Service\AdapterManager::class)
                              ->get('dropbox_user', ['access_token' => $accessToken]);

    $filesystem = new Filesystem($adapter);
    $filesystem->put('TOS.txt', 'hi!');
}

使用相同的createOptions特性,但现在直接从文件系统管理器。注意由文件系统工厂传递给适配器管理器的适配器选项键。

$accessTokens = [...];
foreach ($accessTokens as $accessToken) {
    $filesystem  = $serviceLocator->get(\BsbFlysystem\Service\FilesystemManager::class)
                                  ->get('dropbox_user', [
                                      'adapter_options' => ['access_token' => $accessToken]
                                  ]);

    $filesystem = new Filesystem($adapter);
    $filesystem->put('TOS.txt', 'hi!');
}

挂载管理器

$sourceFilesystem = $serviceLocator->get(\BsbFlysystem\Service\FilesystemManager::class)->get('default'); // local adapter ./data
$targetFilesystem = $serviceLocator->get(\BsbFlysystem\Service\FilesystemManager::class)->get('archive'); // eg. zip archive

$manager = new League\Flysystem\MountManager(array(
    'source' => $sourceFilesystem,
    'target' => $targetFilesystem,
));

$contents = $manager->listContents('source://some_directory', true);
foreach ($contents as $entry) {
    $manager->write('target://'.$entry->path(), $manager->read('source://'.$entry->path()));
}

重命名上传过滤器

@since 1.3.0

BsbFlysystem\Filter\File\RenameUpload可用于重命名或移动上传文件到Flysystem文件系统。

此类接受一个filesystem构造器选项,该选项必须实现League\Flysystem\Filesystem

BsbFlysystem\Filter\File\RenameUpload类扩展了Laminas\Filter\File\RenameUpload类,因此我参考Laminas的文档以获取更多信息。

$request = new Request();
$files   = $request->getFiles();
// i.e. $files['my-upload']['tmp_name'] === '/tmp/php5Wx0aJ'
// i.e. $files['my-upload']['name'] === 'myfile.txt'

// get a filesystem from the BsbFlysystemManager (or construct one manually)
$filesystem = $serviceLocator->get(\BsbFlysystem\Service\FilesystemManager::class)->get('default');

$filter = new \BsbFlysystem\Filter\File\RenameUpload([
    'target' => 'path/to/file.txt',
    'filesystem' => $filesystem
]);

$filter->filter($files['my-upload']);
// or
$filter->filter('path/to/local/file.txt');

// File has been renamed and moved through $filesystem with key 'path/to/file.txt'