Laravel 6+ 要求路由参数必须放在所有类型提示依赖之后,如 public function update(Request $request, $id);中间件中应使用 $request->route('id') 或注入 Route 实例;route() 传参须用关联或索引数组,且参数名须与路由定义完全一致。

不是容器注入 Request 错了,是参数顺序写反了 —— Laravel 6+ 要求路由参数必须放在所有类型提示依赖之后。
控制器方法里 Request 和 $id 同时出现,顺序不能乱
当你在控制器方法中既需要 Request 实例,又依赖路由参数(比如 $id),Laravel 的服务容器会按参数顺序依次解析。如果把 $id 放在 Request $request 前面,容器会尝试把它当服务去解析,结果报错 Target [string] is not instantiable。
- ✅ 正确写法:
public function update(Request $request, $id) - ❌ 错误写法:
public function update($id, Request $request) - 类型提示(如
User $user)也遵循同样规则:必须在Request之后 - 哪怕你只用
$request->input(),不显式写Request $request,只要后面还跟着未类型提示的变量(如$id),顺序依然要守这个规矩
中间件里拿不到 $id?别用 request()->route() 直接链式调用
在中间件 handle() 方法里,$request->route() 可能返回 null,尤其在某些中间件注册位置靠前(比如全局中间件)时,路由尚未完成匹配。直接写 $request->route()->parameter('id') 容易抛出 “Call to a member function parameter() on null”。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- ✅ 安全写法一:
$request->route('id')—— 这是 Laravel 提供的空安全快捷方式,内部做了判空 - ✅ 安全写法二:类型提示
\Illuminate\Routing\Route $route,让容器直接注入已解析好的路由实例:public function handle($request, \Illuminate\Routing\Route $route, Closure $next) - ⚠️ 注意:
$route->parameters()返回的是原始字符串,不会触发隐式模型绑定或类型转换
route() 生成 URL 时传参写成多个参数?它只认一个数组
表单 action 或重定向里用 route('post.update', $id, $slug),第二个及之后的参数会被忽略,最终生成的 URL 缺失参数,触发 Missing required parameter 错误。
- ✅ 必须封装成数组:
route('post.update', ['id' => $id, 'slug' => $slug])(关联数组,键名要和路由定义一致) - ✅ 或按定义顺序用索引数组:
route('post.update', [$id, $slug])(前提是路由是/post/{id}/{slug}) - ⚠️ 路由定义必须用命名占位符,比如
{id},不能写成{0}或其他非名称形式 - ⚠️ 如果参数带
?(可选),比如{slug?},传参时仍需显式提供键值,否则不会被包含进 URL
最容易被忽略的是:路由参数名、控制器参数名、route() 数组键名这三者必须完全一致(区分大小写),少一个字母或大小写不对,模型绑定就失效,$user 就是 null。这不是配置问题,是 Laravel 匹配机制本身的硬约束。


















