# Filesystem

Testing Is Documentation

tests/Filesystem/ManagerTest.php

文件管理统一由文件组件完成,通常我们使用代理 \Leevel\Filesystem\Proxy\Filesystem 类进行静态调用。

内置支持的 filesystem 驱动类型包括 local、zip、ftp、sftp,未来可能增加其他驱动。

TIP

文件系统底层基于 league/flysystem 开发,相关文档可以参考 https://flysystem.thephpleague.com/docs/

# 使用方式

使用容器 flysystems 服务

\App::make('filesystems')->put(string $path, string $contents, array $config = []): bool;

依赖注入

class Demo
{
    private \Leevel\Filesystem\Manager $filesystem;

    public function __construct(\Leevel\Filesystem\Manager $filesystem)
    {
        $this->filesystem = $filesystem;
    }
}

使用静态代理

\Leevel\Filesystem\Proxy\Filesystem::put(string $path, string $contents, array $config = []): bool;

# filesystem 配置

系统的 filesystem 配置位于应用下面的 option/filesystem.php 文件。

可以定义多个文件系统连接,并且支持切换,每一个连接支持驱动设置。

<?php

declare(strict_types=1);

/*
 * This file is part of the your app package.
 *
 * The PHP Application For Code Poem For You.
 * (c) 2018-2099 http://yourdomian.com All rights reserved.
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

return [
    /*
     * ---------------------------------------------------------------
     * 文件驱动
     * ---------------------------------------------------------------
     *
     * 采用什么方式发送邮件数据
     */
    'default' => Leevel::env('FILESYSTEM_DRIVER', 'local'),

    /*
     * ---------------------------------------------------------------
     * 文件驱动连接参数
     * ---------------------------------------------------------------
     *
     * 这里为所有的 filesystem 驱动的连接参数,每一种不同的驱动拥有不同的配置
     * 虽然有不同的驱动,但是在使用上却有着一致性
     */
    'connect' => [
        'local' => [
            // driver
            'driver' => 'local',

            // path
            'path' => Leevel::storagePath(),
        ],

        'zip' => [
            // driver
            'driver' => 'zip',

            // path
            'path' => Leevel::storagePath('filesystem.zip'),
        ],

        'ftp' => [
            // driver
            'driver' => 'ftp',

            // 主机
            'host' => Leevel::env('FILESYSTEM_FTP_HOST', 'ftp.example.com'),

            // 端口
            'port' => (int) Leevel::env('FILESYSTEM_FTP_PORT', 21),

            // 用户名
            'username' => Leevel::env('FILESYSTEM_FTP_USERNAME', 'your-username'),

            // 密码
            'password' => Leevel::env('FILESYSTEM_FTP_PASSWORD', 'your-password'),

            // 根目录
            'root' => '',

            // 被动、主动
            'passive' => true,

            // 加密传输
            'ssl' => false,

            // 超时设置
            'timeout' => 20,
        ],

        'sftp' => [
            // driver
            'driver' => 'sftp',

            // 主机
            'host' => Leevel::env('FILESYSTEM_SFTP_HOST', 'sftp.example.com'),

            // 端口
            'port' => (int) Leevel::env('FILESYSTEM_SFTP_PORT', 22),

            // 用户名
            'username' => Leevel::env('FILESYSTEM_SFTP_USERNAME', 'your-username'),

            // 密码
            'password' => Leevel::env('FILESYSTEM_SFTP_PASSWORD', 'your-password'),

            // 根目录
            'root' => '',

            // 私钥路径
            'privateKey' => '',

            // 超时设置
            'timeout' => 20,
        ],
    ],
];

filesystem 参数根据不同的连接会有所区别。

Uses

<?php

use League\Flysystem\Filesystem as LeagueFilesystem;
use Leevel\Di\Container;
use Leevel\Di\IContainer;
use Leevel\Filesystem\Manager;
use Leevel\Option\Option;

# 文件系统基本使用方法

public function testBaseUse(): void
{
    $manager = $this->createManager();
    $path = __DIR__.'/forManager';
    $this->assertInstanceof(LeagueFilesystem::class, $manager->getFilesystem());

    $manager->put('hellomanager.txt', 'manager');
    $file = $path.'/hellomanager.txt';

    $this->assertTrue(is_file($file));
    $this->assertSame('manager', file_get_contents($file));

    unlink($file);
    rmdir($path);
}