Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 具有多个通配符的路由模型绑定_Laravel_Routes_Route Model Binding - Fatal编程技术网

Laravel 具有多个通配符的路由模型绑定

Laravel 具有多个通配符的路由模型绑定,laravel,routes,route-model-binding,Laravel,Routes,Route Model Binding,如何明确地说路由模型绑定以仅获取相关类别?我的web.php文件如下所示: Route::get('/catalog/{category}', [CategoryController::class, 'index'])->name('category.index'); Route::get('/catalog/{category}/{subcategory}', [SubcategoryController::class, 'index'])->name('subcategory.i

如何明确地说路由模型绑定以仅获取相关类别?我的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';
}
它部分工作正常。它加载了所有的slug,但问题是,假设我有三星子类别和它的父类别,比如:

目录/手机/安卓/三星

每当我将目录/移动电话/android/samsung的url修改为目录/移动电话/ios/samsung时,它都会工作,而实际上它不应该工作。如何处理第二种情况


PS:如果我打开子类别并更改类别slug,它也适用。但是,很明显,如果上层类别不存在,它将抛出404。

您可能需要对文档进行一些探索,了解显式路由模型绑定和自定义解析逻辑,以获得一些想法。

下面的内容未经测试,我对您的表结构进行了一些猜测,但我认为这应该让您了解如何更改路由模型绑定以满足您的需要。同样的概念也可以应用于
{subcategory}
绑定,但只需进行一次关系检查

App/Providers/RouteServiceProvider.php

公共函数启动()
{
//…默认代码。。。
//添加绑定“subsubcategory”的自定义解析
路由::绑定('subsubcategory',函数($slug,$Route){
//检查类别是否存在
如果($category=category::where('slug',$route->parameter('category'))->first()){
//检查类别下是否存在子类别
如果($subcategory=$category->subcategories()->where('slug',$route->parameter('subcategory'))->first()){
//检查子类别下是否存在子类别
如果($subsubcategory=$subcategory->subsubsubcategories()->where('slug',$slug)->first()){
//成功,就有正确的关系
返回$subcategory;
}
}
}
//如果我们到了这里,就会失败(404)
抛出新的ModelNotFoundException();
});
}

但是,我要注意,这会进行许多单独的数据库调用。如果需要优化,可能会有更有效的方法通过其他方法实现相同的目标。

尝试反转列出的路由,改为“路由::获取('/catalog/{category}/{subcategory}/{subsubsubcategory}',[SubsubcategoryController::class,'index'])->名称('subsubsubcategory.index');路由::get('/catalog/{category}/{subcategory}',[subcategory controller::class,'index'])->name('subcategory.index');路由::get('/catalog/{category}',[CategoryController::class,'index'])->name('category.index')```谢谢你的回复,但它仍然以同样的方式工作,非常完美。非常感谢。