必须安装适配器包并传入实现AdapterInterface的实例,否则Filesystem构造失败;v3中LocalFilesystemAdapter需绝对路径,跨存储复制须用MountManager。

直接装 league/flysystem 不够,必须配适配器才能用;只跑 composer require league/flysystem 会得到一个“不能工作的核心”,连 write() 都抛 TypeError。
为什么装完就报错:Argument 1 passed to Filesystem::__construct() must be an instance of AdapterInterface
这是最典型的“只装了半套”错误。v3 版本里 Filesystem 构造函数**强制要求传入一个实现了 AdapterInterface 的实例**,而 league/flysystem 包本身不带任何具体适配器。
- 你写了
new Filesystem($adapter),但$adapter是 null、是字符串、或根本没初始化 —— 就会触发这个错误 - 常见误操作:漏装适配器包(比如要用本地存储却没装
league/flysystem-local),或用了过时的类名(如LocalAdapter是 v1 的,v3 应该用LocalFilesystemAdapter) - 路径参数必须是绝对路径:
/var/www/storage✅,./storage❌(CLI 下可能侥幸成功,Web 环境因getcwd()不稳定极易失败)
本地存储怎么一步配通(v3 正确写法)
别抄旧教程里的 new Local(...) 或 new Adapter(...),v3 类名和构造逻辑全变了。
- 先装两个包:
composer require league/flysystem+composer require league/flysystem-local - 代码里用这三行就跑得起来:
use League\Flysystem\Filesystem;
use League\Flysystem\Local\LocalFilesystemAdapter;
$adapter = new LocalFilesystemAdapter('/absolute/path/to/storage');
$filesystem = new Filesystem($adapter);
$filesystem->write('test.txt', 'ok');
注意:LocalFilesystemAdapter 不是 LocalAdapter,也不是 Adapter(后者在 v3 中已不存在)。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
要换 S3 / FTP / OSS 怎么加适配器
不要一次性全装,按需加,避免冲突。每个适配器是独立包,且依赖不同 SDK。
- AWS S3:
composer require league/flysystem-aws-s3-v3,再传AwsS3V3Adapter实例(它要你先建S3Client) - FTP:
composer require league/flysystem-ftp,然后 newFtpAdapter(注意是FtpAdapter,不是FtpFilesystemAdapter) - 阿里云 OSS:
composer require "iidestiny/flysystem-oss:^4",第三方包命名和参数风格和官方不一致,别混用 - 查谁拖了后腿?遇到版本冲突,用
composer why aws/aws-sdk-php查哪个包在拉旧版,比硬删vendor理性得多
跨存储复制文件为什么 copy() 不起作用
$localFs->copy('a.txt', 's3://b.txt') 必然失败——copy() 只支持同个 Filesystem 实例内的路径,不认协议前缀。
真正支持跨源的是 MountManager,它才是 Flysystem 设计的调度中枢:
- 构造时传
['local' => $localAdapter, 's3' => $s3Adapter] - 之后路径写成
local://a.txt和s3://b.txt - 调用
$mountManager->copy('local://a.txt', 's3://b.txt')才有效
Adapter 和 Filesystem 是两层,漏掉任一都跑不起来;MountManager 是第三层,专为多端协同存在——这点最容易被跳过,结果卡在“明明两个 Filesystem 都能单独读写,就是拷不过去”。

















