更改web.php文件中的路由顺序导致我的应用程序在Laravel 9中抛出404错误



我试图在我的Laravel网站上对类别类进行CRUD(创建,读取,更新和销毁)操作。因此,我将相关的路由定义如下:

//Routes for Categories
Route::get('categories',[CategoryController::class, 'index'])->name('categories');
Route::get('categories/{category}',[CategoryController::class, 'show'])->name('show_category');
Route::get('categories/create',[CategoryController::class, 'create'])->name('create_category');
Route::get('categories/edit/{category}',[CategoryController::class, 'edit'])->name('edit_category');
Route::get('categories/destroy',[CategoryController::class, 'destroy'])->name('destroy_category');
Route::post('categories/store',[CategoryController::class, 'store'])->name('store_category');
Route::put('categories/update/{category}',[CategoryController::class, 'update'])->name('update_category');

然后我制作了一个名为create-category.blade.php的视图文件,最后,在Category模型的相关控制器中,我为create方法编写了以下代码:

public function create()
{
$pageTitle = "Create New Category";
return view('create-category', compact('pageTitle'));
}

使用上面提到的代码和下面一行代码在我的categories.blade.php文件,我收到一个404错误,当我试图访问我的create-category.blade.php文件。

<a class="nav-link" href="{{ route('create_category') }}">Create New Category</a>

说了这么多,当我改变已经定义路线的行顺序时,问题就解决了。我的意思是,当我像下面这样更改web.php文件时,一切都OK(基本上,我将创建的路由移动到第一行)。

//Routes for Categories
Route::get('categories/create',[CategoryController::class, 'create'])->name('create_category');
Route::get('categories',[CategoryController::class, 'index'])->name('categories');
Route::get('categories/{category}',[CategoryController::class, 'show'])->name('show_category');
Route::get('categories/edit/{category}',[CategoryController::class, 'edit'])->name('edit_category');
Route::get('categories/destroy',[CategoryController::class, 'destroy'])->name('destroy_category');
Route::post('categories/store',[CategoryController::class, 'store'])->name('store_category');
Route::put('categories/update/{category}',[CategoryController::class, 'update'])->name('update_category');

这背后有什么原因吗?

正如@Marleen所说,你必须首先设置最精确的路线。在你的例子中,它应该看起来像

//Routes for Categories
Route::get('categories/edit/{category}',[CategoryController::class, 'edit'])->name('edit_category');
Route::put('categories/update/{category}',[CategoryController::class, 'update'])->name('update_category');
// ^ 3 segment routes are set first
Route::get('categories/create',[CategoryController::class, 'create'])->name('create_category');
Route::get('categories/destroy',[CategoryController::class, 'destroy'])->name('destroy_category');
Route::post('categories/store',[CategoryController::class, 'store'])->name('store_category');
// ^ 2 segment routes with exact match are set second
Route::get('categories/{category}',[CategoryController::class, 'show'])->name('show_category');
// ^ 2 segment routes with dynamic match is set third
Route::get('categories',[CategoryController::class, 'index'])->name('categories');
// ^ 1 segment route with exact match is set fourth

对于CRUD操作,还有一个Route::资源,节省了一些行和顺序问题

我给你的建议代码:

Route::resource('categories', CategoryController::class);