在 symfony 7.1 中必须通过 flysystembundle 显式集成并正确配置,否则 filesystemoperator 无法自动注入且 read()/write() 调用将失败;需安装 league/flysystem-bundle、清除旧 oneup 配置、使用绝对路径配置 local adapter,并通过类型提示注入 $defaultstorage 使用。

在 Symfony 7.1 中为项目创建可靠、可切换的文件存储,必须通过 FlysystemBundle 显式集成并完成配置,否则 【FilesystemOperator 无法自动注入,所有 read()/write() 调用将直接失败】。
安装 FlysystemBundle
运行命令安装官方推荐的 Bundle:composer require league/flysystem-bundle。
FlysystemBundle 已适配 Symfony 7.1,无需额外兼容层;若项目中已存在 oneup/flysystem-bundle,请先执行 composer remove oneup/flysystem-bundle 并彻底删除 config/packages/oneup_flysystem.yaml 或 config.yml 中所有 oneup_flysystem: 配置块,否则会触发 【ServiceNotFoundException:无法自动绑定 FilesystemOperator 类型参数】。
配置本地文件系统
在 config/packages/flysystem.yaml 中写入以下内容:
flysystem: storages: default_storage: adapter: 'local' options: directory: '%kernel.project_dir%/public/uploads'
注意:directory 必须是绝对路径,【不能写成 uploads/ 或 ./uploads,否则 Flysystem 会在 PHP 当前工作目录(通常是 public/)下查找,而非项目根目录】;Windows 用户务必使用正斜杠 /,不要用反斜杠 \。
在控制器中使用存储服务
方法一:类型提示自动注入
在控制器方法签名中声明 FilesystemOperator $defaultStorage 参数,Symfony 会按命名自动绑定:public function upload(Request $request, FilesystemOperator $defaultStorage)。
方法二:通过容器获取(仅调试时临时使用)
在控制器内调用 $this->get('default_storage'),返回对象类型为 League\Flysystem\FilesystemOperator;该方式绕过自动注入,不适用于类型安全要求高的场景。
写入文件示例:$defaultStorage->write('test.txt', 'Hello Flysystem');。
读取前务必先验证文件是否存在:if ($defaultStorage->has('test.txt')) { ... };file_exists() 在 Flysystem 环境下不可靠,它不感知 Flysystem 的抽象路径映射。











