Laravel中如何通过AJAX将数据与嵌套路由参数传递到控制器
问题根因
你遇到的dd()未执行是因为路由参数匹配失败、变量拼写错误两个核心问题导致请求根本没有进入目标控制器方法,具体问题点如下:
- 模板中
$gajllery->id拼写错误,多了一个字母j,导致路由生成的URL中gallery_id参数异常,甚至URL生成失败 - 嵌套资源路由的
destroy方法会自动传递两个路由参数(父模型product_id、子模型gallery_id),但你的控制器方法只接收了Product $product一个参数,参数数量不匹配导致路由绑定失败 - AJAX请求中的
name变量没有赋值,未定义的变量会导致JS报错,请求根本不会发送
修复步骤
修正拼写错误
将AJAX部分的$gajllery->id改为正确的$gallery->id补全控制器方法参数
嵌套资源路由的参数顺序为「父模型参数在前,子模型参数在后」,修改控制器方法为:
public function destroy(Product $product, Gallery $gallery, Request $request) { $filename = $request->get('name'); dd($filename); // 优化建议:已通过隐式绑定拿到gallery实例,不需要额外传name参数 // 直接用以下代码即可,无需前端传文件名: // Storage::disk('public')->delete($gallery->image); // $gallery->delete(); Gallery::where('image', $filename)->delete(); Storage::disk('public')->delete($filename); }
如果不需要隐式绑定Gallery模型,也可以写成:
public function destroy(Product $product, $gallery_id, Request $request)
- 修正AJAX的name参数赋值
提前定义name变量,示例如下:
@isset($gallery) // 示例从gallery实例中直接取文件名,可根据你的业务逻辑调整取值方式 const name = '{{ $gallery->image }}'; $.ajax({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'), }, type: 'POST', url: '{{ route('products.galleries.destroy', [$product->id, $gallery->id]) }}', data : { "_method" : "DELETE" , name: name }, success: function (data) { console.log(data); }, error: function (e){ console.log(e); }, }); @endisset
验证方法
修复后打开浏览器控制台的「网络」标签,触发请求查看状态码:
- 状态码为200说明请求正常进入控制器,
dd()会正常输出 - 状态码为404说明路由参数仍有错误,检查生成的URL是否符合
products/{product}/galleries/{gallery}的格式 - 状态码为500说明控制器逻辑有错误,查看响应详情定位问题
内容的提问来源于stack exchange,提问作者user16277300
相关产品推荐
相关产品推荐

