Laravel删除文章时删除存储图片报错:Storage类未找到
问题原因与解决方案
为什么系统会在控制器目录查找Storage类?
兄弟,这是PHP命名空间的锅!你的控制器默认处于App\Http\Controllers命名空间下,当你直接在控制器里写Storage::delete(...)时,PHP会自动在当前命名空间(也就是App\Http\Controllers)里找这个Storage类,但实际上Laravel的Storage facade是放在Illuminate\Support\Facades命名空间下的,所以系统自然找不到,就抛出了“Class 'App\Http\Controllers\Storage' not found”的错误。
至于展示图片时正常,大概率是你用了全局辅助函数(比如asset('storage/xxx'))或者通过配置文件已经做好了存储路径的映射,这些操作不需要直接调用Storage类,所以不会触发命名空间的问题。
解决方法(三种任选其一)
1. 引入Storage facade的命名空间
在控制器文件的顶部,加上这行代码,明确告诉PHP我们要用的是哪个Storage类:
use Illuminate\Support\Facades\Storage;
之后你就可以正常使用Storage::delete($path)来删除文件了。
2. 使用全局辅助函数storage()
Laravel提供了全局的storage()辅助函数,不需要引入命名空间就能直接调用,把你的删除代码改成这样:
storage()->delete('public/posts/' . $post->image);
3. 使用完全限定名调用
如果不想引入命名空间,也可以直接写Storage类的完整命名空间路径:
\Illuminate\Support\Facades\Storage::delete('public/posts/' . $post->image);
举个实际修改例子
假设你原来的删除方法代码是这样的:
public function destroy($id) { $post = Post::findOrFail($id); // 这里报错的代码 Storage::delete('public/posts/' . $post->image); $post->delete(); return redirect()->back()->with('success', '文章删除成功'); }
用第一种方法修改后:
// 顶部引入命名空间 use Illuminate\Support\Facades\Storage; class PostController extends Controller { public function destroy($id) { $post = Post::findOrFail($id); Storage::delete('public/posts/' . $post->image); $post->delete(); return redirect()->back()->with('success', '文章删除成功'); } }
这样就能正常删除对应的图片文件啦!
内容的提问来源于stack exchange,提问作者KB_Shayan
相关产品推荐
相关产品推荐

