Laravel多级通配符路由模型绑定如何校验上级分类关联关系
Laravel多级分类路由关联校验解决方案
方案1:使用Laravel内置作用域绑定(推荐,Laravel 7+ 支持)
Laravel自带的scopeBindings路由方法可以自动根据模型定义的关联关系校验路由参数的从属关系,无需额外写绑定逻辑,仅需调整路由定义:
// 给catalog路由组统一加作用域绑定 Route::prefix('catalog')->scopeBindings()->group(function () { Route::get('/{category}', [CategoryController::class, 'index'])->name('category.index'); Route::get('/{category}/{subcategory}', [SubcategoryController::class, 'index'])->name('subcategory.index'); Route::get('/{category}/{subcategory}/{subsubcategory}', [SubsubcategoryController::class, 'index'])->name('subsubcategory.index'); });
实现逻辑:
- 路由参数名必须和模型中定义的关联方法名完全对应,比如
Subcategory模型里关联上级分类的方法叫category,路由上级参数就命名为{category},框架会自动查询属于对应上级分类的子模型,匹配失败直接返回404。 - 你当前的模型关联和路由参数命名已经符合要求,直接加
scopeBindings即可生效。
方案2:自定义路由模型绑定(兼容旧版本Laravel)
如果使用的Laravel版本低于7,没有scopeBindings方法,可以在app/Providers/RouteServiceProvider.php的boot方法中手动定义绑定逻辑:
public function boot() { parent::boot(); // 绑定二级分类,校验所属一级分类 Route::bind('subcategory', function ($slug, $route) { return Subcategory::where('slug', $slug) ->whereHas('category', function ($query) use ($route) { $query->where('slug', $route->parameter('category')); })->firstOrFail(); }); // 绑定三级分类,校验所属二级分类和一级分类 Route::bind('subsubcategory', function ($slug, $route) { return Subsubcategory::where('slug', $slug) ->whereHas('subcategory', function ($query) use ($route) { $query->where('slug', $route->parameter('subcategory')) ->whereHas('category', function ($q) use ($route) { $q->where('slug', $route->parameter('category')); }); })->firstOrFail(); }); }
修改后只要路由中上级分类slug和当前分类的从属关系不匹配,就会自动抛出404错误,解决非法路径可访问的问题。
内容的提问来源于stack exchange,提问作者Coverdale101
相关产品推荐
相关产品推荐

