Laravel路由参数自动注入控制器方法需满足:路由用{name}占位符、方法参数名完全一致(区分大小写)、支持多参数按名匹配、类型提示可触发转换;隐式模型绑定需类型提示模型类;中间件中应通过$request->route('key')获取参数;route()生成URL时第二个参数必须为数组。

控制器方法里直接写参数名就行
只要路由定义里用了 {id}、{slug} 这样的占位符,Laravel 就会自动把值塞进同名的控制器方法参数里,不用手动取。这是最常用也最省事的方式。
- 路由必须用命名占位符,比如
Route::get('/post/{id}', [PostController::class, 'show']); - 控制器方法参数名必须完全一致(区分大小写),且不能加引号:
public function show($id)✅,public function show('$id')❌ - 支持多个参数,顺序无关,只看名字匹配:哪怕路由是
/post/{slug}/{id},你写成function show($id, $slug)也能对上 - 如果加了类型提示如
int $id,Laravel 会尝试转整型;但 URL 传了非数字(比如/post/abc),默认返回 404 —— 不是报错,是静默失败
中间件或构造函数里拿不到参数?别用 request()
在控制器构造函数、中间件 handle() 方法里,不能直接调 request()->route()->parameter('id'),因为此时请求还没完全绑定,request() 可能返回空实例。
- 正确做法是在
handle()里用$request->route('id')或$request->route()->parameter('id')—— 这俩是安全的快捷方式 - 或者更明确地类型提示
Illuminate\Routing\Route $route,让容器直接注入路由实例:public function handle($request, \Illuminate\Routing\Route $route) - 注意:
$route->parameters()返回的是原始字符串,不会触发隐式模型绑定,也不做类型转换
route() 生成链接时传参必须用数组
给带可选参数的命名路由(比如 {slug?})生成 URL,route('post.show', '123', 'hello') 这种写法根本不行——只有第一个参数生效,后面全被忽略。
-
route()函数签名是route($name, $parameters = [], $absolute = true),第二个参数只认一个数组,不接受多个散列参数 - 必须封装成索引数组(按定义顺序):
route('post.show', ['123', 'hello']) - 更推荐关联数组,语义清晰又抗重构:
route('post.show', ['id' => '123', 'slug' => 'hello']),省略slug键就自动跳过可选段 - 千万别传
null或空字符串当可选参数值,否则 URL 会出现双斜杠/post/123//,可能破坏路由匹配
想直接查数据库?试试隐式模型绑定
如果参数名和模型主键一致(比如 {id} 对应 App\Models\Post 的 id 字段),Laravel 能自动查出模型实例,控制器里直接拿到对象,不是 ID 字符串。
- 只需在方法里类型提示模型类:
public function show(Post $post),$post就是已查询好的 Eloquent 实例 - 找不到记录时自动返回 404,不用自己写
findOrFail() - 想用
slug查询?在模型里加public function getRouteKeyName(),返回'slug' - 注意:绑定发生在依赖注入阶段,所以构造函数里拿不到
$post,得放到具体方法里



















