Symfony4中删除数据库记录时无法删除对应文件夹文件的问题
解决Symfony4中删除文件失败的问题
你遇到的核心问题是路径占位符没有被正确解析——直接把%kernel.project_dir%写在字符串里,Symfony不会自动将它替换成实际的项目目录路径,所以Filesystem类根本找不到要删除的文件。下面给你几个靠谱的解决方案:
方案1:通过KernelInterface获取真实项目目录
你可以在Controller的方法中注入KernelInterface,用它的getProjectDir()方法拿到实际路径,这样就能正确拼接文件地址了:
/** * @Route("admin/soumission/{id}/supprimer", name="supprimer_soumission") */ public function supprimerSoumission(Soumission $soumission, ObjectManager $manager, KernelInterface $kernel) { $lettresoumission = $soumission->getLettreSoumission(); if ($lettresoumission) { // 先判断是否存在文件名,避免空值报错 $filesystem = new Filesystem(); // 拼接正确的实际文件路径 $path = $kernel->getProjectDir() . '/public/uploads/LettresSoumissios/' . $lettresoumission; // 先检查文件是否存在再删除,防止无意义报错 if ($filesystem->exists($path)) { $filesystem->remove($path); } } $manager->remove($soumission); $manager->flush(); $this->addFlash('success','Soumission supprimer !!'); return $this->redirectToRoute('soumission'); }
方案2:直接注入你配置的repertoire_soumissions参数
既然你已经在services.yml里配置了这个参数,不如直接把它注入到Controller里,这更符合Symfony的最佳实践:
首先在services.yml里给你的Controller添加参数注入:
# config/services.yml services: App\Controller\你的SoumissionController类名: arguments: $repertoireSoumissions: '%repertoire_soumissions%'
然后在Controller里使用这个预配置好的路径:
// 先在类顶部声明属性 private $repertoireSoumissions; // 通过构造函数注入参数 public function __construct(string $repertoireSoumissions) { $this->repertoireSoumissions = $repertoireSoumissions; } /** * @Route("admin/soumission/{id}/supprimer", name="supprimer_soumission") */ public function supprimerSoumission(Soumission $soumission, ObjectManager $manager) { $lettresoumission = $soumission->getLettreSoumission(); if ($lettresoumission) { $filesystem = new Filesystem(); $path = $this->repertoireSoumissions . '/' . $lettresoumission; if ($filesystem->exists($path)) { $filesystem->remove($path); } } $manager->remove($soumission); $manager->flush(); $this->addFlash('success','Soumission supprimer !!'); return $this->redirectToRoute('soumission'); }
额外需要检查的点
- 确认
$soumission->getLettreSoumission()返回的是纯文件名,如果它已经包含了完整路径,那你就不需要再手动拼接目录了。 - 检查文件夹名称拼写:你配置里写的是
LettresSoumissios,是不是少了一个'n'?如果是拼写错误,也会导致找不到文件。 - 确认Web服务器对
public/uploads/LettresSoumissios文件夹有删除权限,权限不足也会导致删除操作失败。
内容的提问来源于stack exchange,提问作者m.deye
相关产品推荐
相关产品推荐

