Laravel Web路由应定义在routes/web.php中,使用Route::get()、Route::post()等方法,避免将API路由混入;需注意路由参数命名规范、模型绑定变量名一致性及路由缓存后必须用route:clear或route:cache更新。

routes/web.php 里写 get() 和 post() 就完事了
绝大多数 Web 路由,直接在 routes/web.php 里调用 Route::get()、Route::post() 这类方法就行。Laravel 自动把请求方法、URI、闭包或控制器方法绑定起来,不用手动注册中间件(web 中间件组已默认包裹)。
常见错误是把 API 路由也塞进 web.php:比如写 Route::post('/api/login', ...),结果 CSRF 验证失败,报 TokenMismatchException。API 应该走 routes/api.php,它默认不启用 web 中间件组。
- GET/HEAD 请求优先用
Route::get(),别用Route::match(['get', 'head'], ...)—— 冗余且易漏掉 HEAD - 需要同时响应多个方法时,明确列出:
Route::match(['get', 'post'], '/search', [...]) - 路由参数必须用花括号包裹:
/user/{id},不能写成/user/:id或/user/$id
Route::resource() 自动生成 7 个 REST 路由,但别盲目用
Route::resource('photos', PhotoController::class) 会一口气注册 index、create、store、show、edit、update、destroy —— 看起来省事,实际常踩两个坑:一是控制器方法名被强制约定(比如必须叫 update()),二是你未必真需要全部 7 个。
比如后台管理页只读列表和详情,根本不需要 create/store/edit/update/destroy,硬套 resource() 反而让路由表膨胀,还可能暴露未实现的端点(访问 /photos/create 报 500)。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 只用部分动作:加
->only(['index', 'show'])或->except(['create', 'edit']) - 自定义动作名?用
->names(['index' => 'photos.list']),避免和默认名冲突 - 嵌套路由(如
/posts/{post}/comments)别嵌套resource(),先写父路由,再用->scopeBindings()或显式传参
路由模型绑定失效?检查控制器参数类型提示和路由参数名
写 Route::get('/user/{user}', [UserController::class, 'show']),控制器里写 public function show(User $user),本该自动查出模型,结果 $user 是空字符串或 404 —— 问题八成出在参数名不一致。
Laravel 路由模型绑定严格依赖「路由参数名」和「控制器方法参数变量名」完全一致(区分大小写)。写成 {userId} 但提示类型是 User $user,就完全不触发绑定。
- 参数名必须小写、单数、无下划线:
{post}→Post $post,不是{post_id}或{Post} - 如果要用自定义键(比如用
slug查找),在模型里加public function getRouteKeyName()方法返回'slug' - 想跳过隐式绑定改用显式查找?直接写
public function show(string $id),然后手动User::where('id', $id)->firstOrFail()
路由缓存后改了代码没生效?别只清 cache:clear
上线前跑 php artisan route:cache 能加速路由匹配,但之后改了 routes/*.php 文件,只执行 php artisan cache:clear 没用 —— 缓存的路由文件还在 bootstrap/cache/routes-v7.php(版本号可能不同)里躺着。
本地开发几乎没必要开路由缓存;CI/CD 流水线里如果用了,必须确保每次部署都重新生成,而不是只清应用缓存。
- 正确清除方式:
php artisan route:clear(删缓存文件)或php artisan route:cache(重生成) - 缓存后,
routes/channels.php和routes/console.php不会被加载,它们不走同一套机制 - 用了闭包定义路由?缓存会失败,报
Unable to serialize closure—— 必须改用控制器语法


















