laravel 11 升级后 flysystem 3.x 接口契约收紧:驱动需显式构造并注册全限定类名,方法返回 result 对象或抛异常,路径标准化、递归操作需显式声明,缓存需手动包装。

从 Laravel 8 升级到 11,文件存储层底层由 Flysystem 1.x 升级至 3.x,API 行为、方法签名和错误处理逻辑发生实质性变化。不是“功能增强”,而是接口契约收紧——旧代码不改写,上传、判断存在、列出目录等操作会静默失败或抛出未捕获异常。
核心驱动类与构造方式变更
Flysystem 3.x 移除了全局适配器工厂(Adapter::local() 等),所有驱动必须显式构造并注入容器。Laravel 11 不再自动绑定 League\Flysystem\Filesystem 到服务容器,需手动注册或通过 Storage facade 间接使用。
- Laravel 8:可直接 new LocalAdapter(base_path('storage')),再传入 Filesystem 构造器
- Laravel 11:必须用
League\Flysystem\Local\LocalFilesystemAdapter(路径参数类型改为string|Path),且构造时需显式传入Permissions配置对象 - 自定义驱动需实现
League\Flysystem\FilesystemOperator接口,而非旧版FilesystemInterface
方法签名与返回值严格化
多数读写方法不再返回布尔值,统一返回 Result 对象或抛出特定异常,需重构错误处理逻辑。
-
put()在 L8 中返回true/false;L11 中返回League\Flysystem\Result实例,成功时含path()和etag(),失败则抛UnableToWriteFile -
has()不再返回bool,而是bool|null(null表示元数据不可达,如 S3 权限不足) -
listContents()返回IteratorAggregate,不再直接是数组;遍历时需调用getIterator()或用foreach自动触发
目录操作与递归行为调整
默认不再递归处理子目录,且路径分隔符强制标准化,对混合斜杠(/ 与 \)更敏感。
-
deleteDirectory()在 L8 中默认递归删除;L11 中必须显式传参['recursive' => true],否则只删空目录 - 所有路径参数经
League\Flysystem\PathNormalizer处理,foo//bar或foo\bar会被统一转为foo/bar,旧代码若依赖原始路径格式会出错 -
copy()和move()不再自动创建目标父目录,需提前调用createDirectory(),否则抛UnableToCreateDirectory
配置与驱动注册方式重构
Laravel 11 废弃了 filesystems.php 中的 'driver' => 'local' 直接映射,改用命名空间驱动类全限定名注册。
- 旧配置
'local' => ['driver' => 'local']在 L11 中无效;必须改为'local' => ['driver' => \League\Flysystem\Local\LocalFilesystemAdapter::class] - 自定义驱动类需继承
League\Flysystem\FilesystemAdapter并重写buildAdapter()方法 - 缓存层(
CacheableFilesystem)不再自动启用,需手动包装:new CacheableFilesystem($adapter, $cache)
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











