Laravel 8+InertiaJS中route()传多参数及表单请求获取问题咨询
相关问题解答
1. InertiaJS中的route()函数是否支持传递多个参数?
完全支持。这个函数是Laravel后端route()辅助函数的前端实现,参数规则和后端完全一致,没有参数数量限制:
- 匹配多个路由占位符时,可以按定义顺序传数组,也可以传关联对象明确指定参数名(推荐用这种方式,避免路由调整时参数顺序错位)
- 需要附加查询参数时,直接在参数对象里添加对应键值对即可,会自动拼接到URL的查询串部分
举个实际用法示例:
如果路由定义为/rooms/{room}/orders/{order},调用时写route('rooms.orders.show', { room: 3, order: 7, tab: 'detail' }),最终会生成类似/rooms/3/orders/7?tab=detail的正确URL。
2. 发起更新请求后控制器无法获取表单提交的数据
这个问题的核心是混淆了route()函数的作用和Inertia请求方法的参数规则:
route()函数仅用于生成符合路由规则的目标URL,它的第二个入参是路由占位符的替换值、需要附带的查询参数,和请求体要提交的业务数据没有关系- Inertia提供的HTTP请求方法(
get/put/post/patch/delete)的签名是方法名(请求URL, 要提交的载荷数据, 可选配置项)
你当前的代码this.$inertia.put(route("rooms.update", this.form));存在两个逻辑错误:
- 把整个
this.form对象直接传给了route()函数,route会把表单字段中匹配路由占位符的部分用来填充URL,剩下的所有字段都会被自动当成查询参数拼到URL后面,而不是作为PUT请求的提交内容 - 调用
put方法时没有传入第二个参数(也就是要提交的表单载荷),整个PUT请求本身没有携带任何请求体数据,控制器自然无法获取预期的表单内容。
正确写法示例
针对rooms.update这个资源路由(对应URL为PUT /rooms/{room},需要绑定Room模型主键),需要把填充路由占位符的主键值传给route()生成正确URL,再把整个表单对象作为put方法的第二个参数传入:
this.$inertia.put( route("rooms.update", this.form.id), // 传入房间ID填充路由的{room}占位符,生成正确的更新URL this.form // 传入完整表单数据,会作为PUT请求的请求体发送到后端 )
按照这个写法调整后,控制器里的$request->all()就能正常获取提交的所有表单字段,同时模型绑定也会根据URL里的room参数正确加载对应的Room实例。如果你的模型绑定使用的是自定义字段而非默认主键,只需把传给route的第二个参数替换为对应绑定字段的值即可。
内容的提问来源于stack exchange,提问作者Rasyidi Alwee
相关产品推荐
相关产品推荐

