如何显式地说将模型绑定路由为只获取相关类别?我的web.php文件如下:
Route::get('/catalog/{category}', [CategoryController::class, 'index'])->name('category.index');
Route::get('/catalog/{category}/{subcategory}', [SubcategoryController::class, 'index'])->name('subcategory.index');
Route::get('/catalog/{category}/{subcategory}/{subsubcategory}', [SubsubcategoryController::class, 'index'])->name('subsubcategory.index');子类别控制器:
public function index(Category $category, Subcategory $subcategory, Subsubcategory $subsubcategory)
{
$subsubcategory->load('product')->loadCount('product');
$products = Product::where('subsubcategory_id', $subsubcategory->id)->orderByRaw('product_order = 0, product_order')->get();
return view('subsubcategory.index', compact('subsubcategory', 'products'));
}有争议的模式:
public function subcategory()
{
return $this->belongsTo(Subcategory::class);
}
public function category()
{
return $this->belongsTo(Category::class);
}
public function getRouteKeyName()
{
return 'slug';
}它的部分工作正常。它装载了所有的子弹,但问题是,假设我有三星的子类别,它的父类别如下:
目录/手机/安卓/三星
每当我将url从catalog/mobile-phones/android/samsung修改为catalog/mobile-phones/ios/samsung时,它就会工作,而实际上它不应该工作。如何处理第二种情况?
PS:如果我打开子类别和更改类别段塞,它也适用。但是,很明显,如果上层类别不存在,它将抛出404。
发布于 2021-05-25 07:23:06
您可能希望了解一些关于显式路由模型绑定和定制解析逻辑的文档,以获得一些想法。
https://laravel.com/docs/8.x/routing#customizing-the-resolution-logic
以下是未经测试的,我正在猜测您的表结构,但我认为这应该给您提供一个基本概念,说明如何更改路由模型绑定以满足您的需要。同样的概念也可以应用于{subcategory}绑定,但只需少进行一次关系检查。
App/Providers/RouteServiceProvider.php
public function boot()
{
// ...default code...
// add custom resolution for binding 'subsubcategory'
Route::bind('subsubcategory', function($slug, $route) {
// check to see if category exists
if ($category = Category::where('slug',$route->parameter('category'))->first()) {
// check to see if subcategory exists under category
if ($subcategory = $category->subcategories()->where('slug',$route->parameter('subcategory'))->first()) {
// check to see if subsubcategory exists under subcategory
if ($subsubcategory = $subcategory->subsubcategories()->where('slug',$slug)->first()) {
// success, proper relationship exists
return $subsubcategory;
}
}
}
// fail (404) if we get here
throw new ModelNotFoundException();
});
}但是,我将注意到,这会产生一些单独的数据库调用。如果考虑优化,可能有更有效的方法通过其他方法来实现相同的目标。
https://stackoverflow.com/questions/67679626
复制相似问题