我試圖使用相同的路線但不同的控制器,但沒有得到一個干凈和好的解決方案,例如我的意圖是:
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');
有人遇到同樣的情況以及如何處理嗎?
uj5u.com熱心網友回復:
無法通知系統 route 中的給定 id 是 category 還是 slug
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
uj5u.com熱心網友回復:
我建議對兩種 slug 型別使用一個控制器操作,以確定需要做什么,并將請求轉發到相應的控制器操作。
https://symfony.com/doc/current/controller/forwarding.html
uj5u.com熱心網友回復:
正如 Laravel 在這種情況下所說,第二條路線永遠不會被訪問,因為第一條路線會覆寫它所以,我只建議您檢查即將到來的,category如果它與資料庫中的任何類別都不匹配,然后將請求重定向到下一個路由,因為它很可能匹配Article模型中的任何記錄,或者如果沒有回傳資料,則最終中止請求。
public function index($category)
{
$data = \App\Models\Category::where('name', $category)->get();
if (empty($data)) {
return redirect()->route('questions.show');
}
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'));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/465359.html
