在 routes/web.php 中添加基础 GET 路由应使用 Route::get('/path', function () { return view('view'); }); 或控制器数组语法,注意路径区分斜杠、中间件需显式包含 web、资源路由用 only/except 控制、修改后须清缓存。

怎么在 routes/web.php 里加一条基础 GET 路由
Laravel 的路由定义不靠注解或配置文件,全写在 routes/web.php(Web 请求)或 routes/api.php(API 请求)里。最常用的是 Route::get(),它接收两个参数:路径字符串和闭包或控制器方法。
常见错误是把路由写在错误的文件里——比如把网页跳转逻辑塞进 api.php,结果中间件没生效、CSRF 报错;或者漏掉 use Illuminate\Support\Facades\Route; 导致函数找不到。
-
Route::get('/home', function () { return view('home'); });是最简写法 - 控制器写法:
Route::get('/users', [App\Http\Controllers\UserController::class, 'index']);,注意类名必须带完整命名空间 - 如果用 PHP 8+,可改用箭头函数:
Route::get('/ping', fn() => 'ok');,但别在里面写多行逻辑 - 路径末尾斜杠默认不自动匹配,
/users和/users/是两条不同路由
为什么 Route::group() 里的中间件不生效
路由分组不是语法糖,它会改变子路由的解析上下文。中间件、命名空间、前缀这些属性都只作用于该分组内定义的路由,不会“继承”父级设置,也不会穿透到其他分组。
典型翻车场景:在分组里写了 middleware(['auth']),但登录态还是没校验——八成是漏了 web 中间件组(它包含 session、CSRF 等),或者把 auth 放在了 web 前面导致 session 还没启动。
- 必须显式声明
web中间件才能用 session:Route::group(['middleware' => ['web', 'auth']], function () { ... }); - 控制器命名空间要配对:
['namespace' => 'Admin']意味着控制器路径从App\Http\Controllers\Admin\...开始找 - 前缀(
prefix)会拼接在每个子路由前,但不会影响重定向生成的 URL,除非你手动调用route()辅助函数 - 分组嵌套不推荐,容易绕晕自己;两层足够,三层以上建议拆成独立文件 +
require
Route::resource() 自动生成的路由哪些能删、哪些不能动
Route::resource('posts', PostController::class) 会一口气注册 7 条 RESTful 路由,包括 index、create、store、show、edit、update、destroy。但不是所有都得留着——比如后台管理可能不需要 create 和 edit(用单页组件替代),API 接口可能只要 index 和 show。
删路由不能靠注释掉某一行,得用 except 或 only 显式控制。否则缓存路由后,旧规则还在,新代码却没对应方法,直接 500。
- 只保留查看类操作:
Route::resource('posts', PostController::class)->only(['index', 'show']); - 去掉表单相关路由:
->except(['create', 'edit', 'store', 'update']) - 自定义某个动作的路径名(比如把
/posts/{id}/edit改成/posts/{id}/config)要用->names(['edit' => 'posts.config']),再配合route('posts.config', $post)生成链接 - 别在资源路由里混用
Route::get('/posts/{id}/publish', ...)—— 它会被show规则提前匹配,除非你把它写在resource()前面
路由缓存后改了 routes/web.php 为啥没反应
Laravel 在生产环境强制要求运行 php artisan route:cache,否则每次请求都要重新加载和编译全部路由,性能差。但缓存是一次性快照,改完 PHP 文件不刷新,就永远读不到新路由。
本地开发时也有人误开缓存,结果新增路由死活 404,查半天中间件和拼写,最后发现只是没清缓存。
- 清缓存命令:
php artisan route:clear(删缓存文件)或php artisan config:clear(顺手清下配置缓存,有时连带影响) - 缓存只支持闭包路由以外的写法,含闭包的路由文件无法缓存,执行
route:cache会直接报错并提示哪一行用了闭包 - CI/CD 部署脚本里记得加
route:cache,但别在本地 git hook 里自动跑——容易覆盖你正在调试的临时路由 - 用
php artisan route:list查看当前生效的路由表,比翻代码更可靠,尤其当多个服务共享同一份路由文件时
路由这东西看着简单,实际卡点都在中间件顺序、缓存机制和分组作用域这些看不见的地方。写完别急着测功能,先 route:list 看一眼生成结果对不对。











