Laravel路由应在routes/web.php中用Route::get()、Route::post()定义,Web与API路由须分离,参数名须与控制器类型提示严格一致,避免盲目使用Route::resource(),命名路由和参数约束可提升可维护性。

直接在 routes/web.php 里用 Route::get()、Route::post() 定义路由,再配好控制器方法签名和参数名,基本就跑通了。关键不是写得多,而是写得准——尤其别混用 API 和 Web 路由,也别让参数名和类型提示对不上。
Web 路由和 API 路由必须分开
绝大多数面向浏览器的页面请求,都该写在 routes/web.php 里。Laravel 已默认为这个文件里的所有路由自动套上 web 中间件组(含 session、CSRF、加密等),开箱即用。
- 写
Route::post('/login', [...])在web.php中 → 自动校验 CSRF token,安全可靠 - 若误写进
api.php→ 没有 CSRF 防护,但反而会因 token 缺失报TokenMismatchException - API 接口统一走
routes/api.php,它默认启用api中间件组(无 session、无 CSRF),适合前后端分离或移动端调用
路由参数与控制器方法要严格对应
Laravel 的隐式模型绑定不是“猜”,而是靠名字完全匹配触发的。比如:
- 路由写
Route::get('/user/{user}', [UserController::class, 'show']) - 控制器方法必须是
public function show(User $user)—— 参数变量名$user和路由占位符{user}必须一模一样(小写、单数、无下划线) - 写成
{userId}或{User}或$id,绑定就失效,$user会是空字符串或直接 404 - 如需按 slug 查找,在模型中加
public function getRouteKeyName()并返回'slug'
别盲目用 Route::resource(),按需注册才高效
Route::resource('photos', PhotoController::class) 会一口气注册 7 个 REST 动作,但实际项目中往往只用其中两三个。
- 后台列表页只需
index和show?那就加->only(['index', 'show']) - 不想暴露未实现的
create或edit页面?用->except(['create', 'edit']) - 自定义路由别名更清晰:
->names(['index' => 'photos.list']),避免和默认名冲突 - 嵌套路由如
/posts/{post}/comments,不要嵌套resource(),先定义父资源,再单独声明子路由
命名路由 + 类型约束,提升可维护性
给路由起名、加约束,看似多一步,实则省去大量后期排查成本。
- 用
->name('user.profile')后,视图里写{{ route('user.profile', ['user' => 123]) }},改路径也不用满代码库搜 URL - 数字 ID 必须是整数?加
->whereNumber('id');slug 只能是字母数字横线?用->where('slug', '[a-z0-9\-]+') - 可选参数写法:
/user/{id?},控制器方法参数带默认值:function ($id = 1) - 路由缓存后记得运行
php artisan route:clear或php artisan route:cache,否则改了不生效



















