Filesystem

Testing Is Documentation

tests/Filesystem/ManagerTest.phpFilesystem - 图1

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

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

TIP

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

使用方式

使用容器 flysystems 服务

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

依赖注入

  1. class Demo
  2. {
  3. private \Leevel\Filesystem\Manager $filesystem;
  4. public function __construct(\Leevel\Filesystem\Manager $filesystem)
  5. {
  6. $this->filesystem = $filesystem;
  7. }
  8. }

使用静态代理

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

filesystem 配置

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

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

  1. <?php
  2. declare(strict_types=1);
  3. /*
  4. * This file is part of the your app package.
  5. *
  6. * The PHP Application For Code Poem For You.
  7. * (c) 2018-2099 http://yourdomian.com All rights reserved.
  8. *
  9. * For the full copyright and license information, please view the LICENSE
  10. * file that was distributed with this source code.
  11. */
  12. return [
  13. /*
  14. * ---------------------------------------------------------------
  15. * 文件驱动
  16. * ---------------------------------------------------------------
  17. *
  18. * 采用什么方式发送邮件数据
  19. */
  20. 'default' => Leevel::env('FILESYSTEM_DRIVER', 'local'),
  21. /*
  22. * ---------------------------------------------------------------
  23. * 文件驱动连接参数
  24. * ---------------------------------------------------------------
  25. *
  26. * 这里为所有的 filesystem 驱动的连接参数,每一种不同的驱动拥有不同的配置
  27. * 虽然有不同的驱动,但是在使用上却有着一致性
  28. */
  29. 'connect' => [
  30. 'local' => [
  31. // driver
  32. 'driver' => 'local',
  33. // path
  34. 'path' => Leevel::storagePath(),
  35. ],
  36. 'zip' => [
  37. // driver
  38. 'driver' => 'zip',
  39. // path
  40. 'path' => Leevel::storagePath('filesystem.zip'),
  41. ],
  42. 'ftp' => [
  43. // driver
  44. 'driver' => 'ftp',
  45. // 主机
  46. 'host' => Leevel::env('FILESYSTEM_FTP_HOST', 'ftp.example.com'),
  47. // 端口
  48. 'port' => (int) Leevel::env('FILESYSTEM_FTP_PORT', 21),
  49. // 用户名
  50. 'username' => Leevel::env('FILESYSTEM_FTP_USERNAME', 'your-username'),
  51. // 密码
  52. 'password' => Leevel::env('FILESYSTEM_FTP_PASSWORD', 'your-password'),
  53. // 根目录
  54. 'root' => '',
  55. // 被动、主动
  56. 'passive' => true,
  57. // 加密传输
  58. 'ssl' => false,
  59. // 超时设置
  60. 'timeout' => 20,
  61. ],
  62. 'sftp' => [
  63. // driver
  64. 'driver' => 'sftp',
  65. // 主机
  66. 'host' => Leevel::env('FILESYSTEM_SFTP_HOST', 'sftp.example.com'),
  67. // 端口
  68. 'port' => (int) Leevel::env('FILESYSTEM_SFTP_PORT', 22),
  69. // 用户名
  70. 'username' => Leevel::env('FILESYSTEM_SFTP_USERNAME', 'your-username'),
  71. // 密码
  72. 'password' => Leevel::env('FILESYSTEM_SFTP_PASSWORD', 'your-password'),
  73. // 根目录
  74. 'root' => '',
  75. // 私钥路径
  76. 'privateKey' => '',
  77. // 超时设置
  78. 'timeout' => 20,
  79. ],
  80. ],
  81. ];

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

Uses

  1. <?php
  2. use League\Flysystem\Filesystem as LeagueFilesystem;
  3. use Leevel\Di\Container;
  4. use Leevel\Di\IContainer;
  5. use Leevel\Filesystem\Manager;
  6. use Leevel\Option\Option;

文件系统基本使用方法

  1. public function testBaseUse(): void
  2. {
  3. $manager = $this->createManager();
  4. $path = __DIR__.'/forManager';
  5. $this->assertInstanceof(LeagueFilesystem::class, $manager->getFilesystem());
  6. $manager->put('hellomanager.txt', 'manager');
  7. $file = $path.'/hellomanager.txt';
  8. $this->assertTrue(is_file($file));
  9. $this->assertSame('manager', file_get_contents($file));
  10. unlink($file);
  11. rmdir($path);
  12. }