Symfony单元测试中UploadedFile无法移动至正确目录问题
解决Symfony测试环境下图片上传路径未指向public目录的问题
问题描述
控制器从表单获取图片后调用move()方法存入配置目录:
- 正常运行时,文件被移动到
projectDir/public/assets/images/logos - PHPUnit测试时,文件被存入
projectDir/assets/images/logos
已确认两种场景下%app.logos_directory%参数值均为assets/images/logos/,需让测试环境下文件也存入public目录。
问题原因
在Symfony HTTP请求上下文(正常运行)中,文件上传的move()方法会默认将相对路径解析到web根目录(即public);但PHPUnit测试运行在命令行上下文,当前工作目录是项目根目录,相对路径直接基于根目录,不会自动拼接public前缀,导致路径不一致。
解决方案
方法一:使用Symfony内置参数构建完整路径
利用Symfony 5.3+提供的%kernel.public_dir%参数,直接在配置中绑定public目录:
修改YML配置:
parameters: app.logos_directory: "%kernel.public_dir%/assets/images/logos/"
控制器代码无需修改,保持原有逻辑:
$logosDirectory = $this->getParameter('app.logos_directory'); $postLogo->move($logosDirectory, $filename);
方法二:在控制器中手动拼接public目录
针对较低版本Symfony,可在控制器中基于项目根目录拼接public路径:
// Controller.php $projectDir = $this->getParameter('kernel.project_dir'); $publicDir = $projectDir . '/public'; // 处理前后斜杠避免重复拼接 $logosDirectory = rtrim($publicDir, '/') . '/' . ltrim($this->getParameter('app.logos_directory'), '/'); $postLogo->move($logosDirectory, $filename);
两种方法均能确保无论运行环境还是测试环境,文件都会存入projectDir/public/assets/images/logos目录,消除路径差异。
内容的提问来源于stack exchange,提问作者Yohan Pastor
相关产品推荐
相关产品推荐

