You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:07:22