Laravel9报Failed to open stream找不到文件错误解决方法
问题根因
报错来自两处代码逻辑错误,最终导致程序没有拿到路由传入的实际文章标识,直接将字面量{slug}拼接进了文件读取路径:
- 文件路径中的变量写法不符合PHP语法:双引号内的变量必须以
$开头,你代码中写的{slug}没有$前缀,PHP不会将其识别为变量做值替换,会直接作为普通字符串拼接。 - 路由参数名与闭包接收参数名不匹配:路由定义的动态参数段为
{post},但闭包内声明的接收参数是$slug,Laravel默认按参数名匹配绑定路由值,这种写法下$slug本身就无法拿到路由传入的实际参数。
可直接运行的修复代码
替换web.php中对应路由段的代码即可:
Route::get('posts/{slug}', function ($slug) { // 使用框架自带的resource_path助手生成路径,避免相对路径计算偏差 $postPath = resource_path("posts/{$slug}.html"); // 增加文件存在校验,访问不存在的文章时返回404而非致命错误 if (!file_exists($postPath)) { abort(404); } $postContent = file_get_contents($postPath); return view('post', [ 'post' => $postContent ]); });
后续排查清单
如果替换代码后仍有问题,按顺序核查:
- 确认
resources/posts目录真实存在,目录下存放的html文件名和访问时传入的slug完全一致,注意大小写敏感问题 - 确认运行PHP进程的用户对
resources/posts目录及下属文件有可读权限 - 如果之前开启过路由缓存,执行
php artisan route:clear清除缓存后再测试
内容的提问来源于stack exchange,提问作者gndulor
相关产品推荐
相关产品推荐

