Laravel控制器store()方法无法获取URI查询参数type的问题咨询
问题根因
两个控制器方法对应不同的HTTP请求场景,参数传递逻辑存在本质差异:
- 访问
index()方法时发起的是GET请求,请求地址本身就是/posts?type=press,type作为URL查询参数直接携带在请求中,因此可以通过$request->get('type')正常读取。 - 调用
store()方法时发起的是POST表单提交请求,Inertia默认会将请求发送到资源路由对应的标准地址/posts,既不会自动把当前页面URL上的查询参数拼接到POST请求地址后,也不会自动将该参数注入请求体,因此请求中只包含表单内提交的inputText字段,自然无法读取到type值。
你可以直接打开浏览器开发者工具的网络面板,查看store对应的POST请求详情,就能确认请求载荷/地址中确实没有携带type参数。
解决方案
任选一种符合你业务逻辑的方案即可:
- 方案1:提交请求时手动拼接查询参数
前端提交表单时,把已经通过props拿到的type值拼到POST请求的地址上:import { router, usePage, reactive } from '@inertiajs/vue3' const form = reactive({ inputText: '' }) const handleSubmit = () => { router.post(`/posts?type=${usePage().props.type}`, form) } - 方案2:表单增加隐藏字段传参
在Vue的表单模板里加一个隐藏输入框,把type值作为表单字段一起提交:
这种方式提交后,type会作为表单字段被后端正常读取,不需要修改提交地址。<form @submit.prevent="handleSubmit"> <input type="hidden" name="type" :value="$page.props.type"> <input v-model="form.inputText" type="text"> <button type="submit">提交</button> </form> - 方案3:路由参数规范化(推荐长期使用)
如果type是用来区分内容类型的固定参数,可以直接调整路由定义,把type作为路由路径的一部分,比如定义POST路由为/posts/{type},前端提交时直接把type拼到路径里,后端通过路由参数读取,比依赖查询参数更稳定。
内容的提问来源于stack exchange,提问作者Halnex
相关产品推荐
相关产品推荐

