Symfony 4中fopen相对路径失效:无法读取JPEG文件求助
解决Symfony 4 Fixtures中读取JPEG文件相对路径失效的问题
这个问题我之前在Symfony项目里也踩过坑,其实核心原因是:PHP里的相对路径是基于当前执行脚本的工作目录,而不是你编写代码的那个文件(UserFixtures.php)所在的目录。
比如你运行bin/console doctrine:fixtures:load命令时,当前工作目录通常是项目的根目录,但如果是在其他目录下执行命令,相对路径就直接失效了——这也是你明明文件存在却报错“file not found”的原因。
给你两个可靠的解决方案:
方案1:用__DIR__常量拼接绝对路径
这是最简单的方法,__DIR__是PHP的魔术常量,代表当前文件(UserFixtures.php)所在的绝对目录(也就是src/DataFixtures),直接拼接子目录路径就能得到准确的文件地址:
// 在UserFixtures.php的load方法里 $avatarPath = __DIR__ . '/avatars/my_avatar.jpeg'; $avatar = stream_get_contents(fopen($avatarPath, 'rb'));
方案2:通过Symfony容器获取项目根目录
如果你需要更灵活的路径管理,可以利用Symfony内置的kernel.project_dir参数(它指向项目的根目录),不过需要让你的Fixtures类能获取到容器:
use Symfony\Component\DependencyInjection\ContainerAwareInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Doctrine\Bundle\FixturesBundle\Fixture; use Doctrine\Persistence\ObjectManager; class UserFixtures extends Fixture implements ContainerAwareInterface { private $container; public function setContainer(ContainerInterface $container = null) { $this->container = $container; } public function load(ObjectManager $manager) { $projectRoot = $this->container->getParameter('kernel.project_dir'); $avatarPath = $projectRoot . '/src/DataFixtures/avatars/my_avatar.jpeg'; $avatar = stream_get_contents(fopen($avatarPath, 'rb')); // 后续的实体处理逻辑... } }
两种方法都能避开相对路径的坑,个人更推荐方案1,代码更简洁,不需要依赖容器。
内容的提问来源于stack exchange,提问作者Mikołaj Waśniewski
相关产品推荐
相关产品推荐

