Laravel Folio 是 Laravel 10+ 内置的「文件即路由」机制,通过 resources/views/pages/ 下的 .blade.php 文件按路径自动生成路由,需手动启用、规范目录结构并注意中间件配置。

直接说结论:Laravel Folio 是 Laravel 10+ 内置的「文件即路由」机制,它不依赖 routes/web.php,而是通过约定好的文件路径自动生成路由,适合静态页面、文档站、营销页等场景——但必须启用并正确组织 resources/views/pages/ 下的文件结构。
启用 Folio 前必须确认的三件事
Folio 不是默认开启的,即使你装了 Laravel 10+ 也得手动激活:
- 确保已安装
laravel/folio包(Laravel 10.42+ 默认包含,旧版需composer require laravel/folio) - 检查
bootstrap/app.php中是否调用了Folio::route()(通常在文件末尾) -
resources/views/pages/目录必须存在,且 Web 服务器有读取权限;空目录不会报错,但也不会注册任何路由
文件路径如何映射为 URL?(含嵌套与参数)
Folio 的路径规则严格遵循「目录即路径段,文件名即路由末端」,支持动态参数和可选段,但不支持通配符或正则约束:
resources/views/pages/home.blade.php → GET /home
resources/views/pages/about/team.blade.php → GET /about/team
resources/views/pages/posts/[id].blade.php → GET /posts/{id}([id] 自动转为命名参数)
resources/views/pages/blog/[year]/[month].blade.php → GET /blog/{year}/{month}
resources/views/pages/contact/[...slug].blade.php → GET /contact/{slug?}(可选多段,slug 是数组)
注意:[...slug] 必须是最后一段,且不能与其他命名参数共存;[id] 类参数名会直接作为 Blade 模板中可用的变量(无需在控制器里传)。
为什么访问页面时 404?常见配置与权限陷阱
绝大多数 404 不是因为写错路径,而是环境或约定被破坏:
- 开发服务器未重启:修改
resources/views/pages/后,需重启php artisan serve(Folio 路由在启动时静态扫描,不热更) - 文件扩展名错误:只识别
.blade.php,.php或.html文件会被忽略 - 视图名称含非法字符:如
user-profile.blade.php生成路由/user-profile没问题,但user@profile.blade.php会导致解析失败(@ 不在允许的文件名字符集内) - Apache 用户需额外配置:确保
.htaccess允许重写,且AllowOverride All已启用;Nginx 用户要确认try_files $uri $uri/ /index.php?$query_string;存在
如何在 Folio 页面中使用 Layout 和共享数据?
Folio 页面本质仍是 Blade 视图,所有 Blade 功能都可用,但没有控制器上下文——共享数据需靠 View Composer 或直接在模板中调用:
@extends('layouts.app')
@section('content')
Welcome, {{ $name ?? 'Guest' }}!
Post ID: {{ $id ?? '(none)' }}
@endsection
若需全局注入数据(如站点标题),推荐在 boot() 方法中用 View::share(),或为特定页面绑定 View Composer。注意:Folio 不调用控制器,所以 with()、中间件参数传递等传统方式无效。
最易被忽略的一点:Folio 路由不经过 app/Http/Middleware 中针对 web 组的中间件(比如 VerifyCsrfToken),它走的是独立的 folio 中间件组——如果页面需要 session 或 auth,得手动在 bootstrap/app.php 的 Folio::route() 调用里加 middleware(...) 参数。











