我试图使用相同的路线,但使用不同的控制器,但没有得到一个干净和好的解决方案,例如,我的意图是:
Domain.com/category-slug
Domain.com/article-slug
但是每个控制器都有不同的控制器,使用相同的结构路由不会到达预期的控制器,上面留下了我的web.php
Route::get('/', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
Route::get('/{category}', [App\Http\Controllers\QuestionController::class, 'index'])->name('category.list');
Route::get('/{slug}', [App\Http\Controllers\QuestionController::class, 'show'])->name('questions.show');
有没有人遇到同样的情况,以及如何处理?
发布于 2022-04-26 13:07:11
正如Laravel在这种情况下所说的,第二条路由将永远不会被访问,因为第一条路由将覆盖它,因此,我建议您只能检查即将到来的category
,如果它与数据库中的任何类别不匹配,然后将请求重定向到下一条路径,因为它很可能匹配Article
模型中的任何记录,或者在没有返回数据的情况下最终中止请求。
public function index($category)
{
$data = \App\Models\Category::where('name', $category)->get();
if (empty($data)) {
return redirect()->route('questions.show', $category);
}
return view('index', compact('data'));
}
public function show($article)
{
$data = \App\Models\Article::where('name', $article)->get();
if (empty($data)) {
abort(404, "NOT FOUND");
}
return view('show', compact('data'));
}
发布于 2022-04-26 22:53:22
无法通知系统,路径中给定的id属于类别或段塞,第一条路径将不让系统进入第二条路由。
Route::get('/', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
Route::get('/{category}', [App\Http\Controllers\QuestionController::class, 'index'])->name('category.list');
Route::get('/{slug}', [App\Http\Controllers\QuestionController::class, 'show'])->name('questions.show');
因此,修改它以添加id类型的前缀,如
Route::get('/', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
Route::get('category/{category}', [App\Http\Controllers\QuestionController::class, 'index'])->name('category.list');
Route::get('slug/{slug}', [App\Http\Controllers\QuestionController::class, 'show'])->name('questions.show');
它看起来就像
Domain.com/category/1
Domain.com/slug/1
发布于 2022-04-26 05:38:25
我建议对这两种类型的代码片段使用一个控制器操作,以确定需要做什么,并将请求转发到相应的控制器操作。
https://stackoverflow.com/questions/72014883
复制