Laravel 8使用Inertia.js+React调用blogs.show路由缺失blog参数报错
报错原因
Ziggy路由生成工具会严格匹配Laravel路由中定义的参数名,路由里的{blog:slug}仅表示该路由参数名为blog,查询模型时用slug字段做隐式绑定,不代表参数名变成slug。直接向route()方法传入slug字符串时,Ziggy无法识别该值对应blog参数,因此抛出参数缺失错误。
解决方案
- 方法1(最推荐,无需改动其他业务逻辑)
调整视图层的路由传参写法,显式指定参数名和值的对应关系:<Link href={route('blogs.show', {blog: props.blog.slug})} className="text-blue-500 inline-flex items-center md:mb-2 lg:mb-0">Learn More <svg className="w-4 h-4 ml-2" viewBox="0 0 24 24" stroke="currentColor" strokeWidth="2" fill="none" strokeLinecap="round" strokeLinejoin="round"> <path d="M5 12h14"/> <path d="M12 5l7 7-7 7"/> </svg> </Link> - 方法2(适配直接传值的写法)
如果希望直接传slug字符串就能生成路由,可修改路由定义的参数名,同步调整控制器的查询逻辑:
路由修改为:
控制器修改为:Route::get('blogs/{slug}', [BlogController::class, 'show'])->name('blogs.show');
此时视图层原来的传参写法可正常使用。public function show(string $slug) { $blog = Blog::where('slug', $slug)->firstOrFail(); return inertia('Blogs/Show', compact('blog')); } - 方法3:排查参数有效性
如果调整写法后仍报错,可在视图层先打印props.blog.slug确认该值不为空或undefined,参数值为空时Ziggy也会判定为参数缺失。
内容的提问来源于stack exchange,提问作者swatantra
相关产品推荐
相关产品推荐

