Laravel报错:路由admin/categories不支持GET方法,仅支持POST
核心问题分析
报错提示The GET method is not supported for route admin/categories. Supported methods: POST,本质是请求方式与路由定义不匹配,结合代码细节,主要有以下几个触发原因及对应解决方案:
1. 路由前缀缺失,路径不匹配
你的路由组仅配置了admin.auth中间件,但未设置prefix('admin'),而报错指向的路由是admin/categories,说明实际访问路径带admin前缀,但路由定义的是/categories,两者不匹配。表单默认提交时会请求不存在的admin/categories GET路由,触发报错。
解决方案:
修改web.php的路由组,添加prefix参数:
Route::group(['middleware' => 'admin.auth', 'prefix' => 'admin'],function(){ // Categories Routes Route::get('/categories/create',[CategoryController::class,'create'])->name('categories.create'); Route::post('/categories',[CategoryController::class,'store'])->name('categories.store'); });
2. 未阻止表单默认提交行为
你的JS代码没有阻止表单的默认提交事件,用户点击提交按钮时,浏览器会优先执行表单的默认GET提交(若表单未指定method="POST"),直接触发错误请求,AJAX来不及执行。
解决方案:
在表单提交事件中添加阻止默认行为的代码,并修正JS方法拼写错误:
$('form').submit(function(e) { e.preventDefault(); // 阻止表单默认提交 var element = $(this); $.ajax({ url: '{{ route("categories.store") }}', type: 'post', headers: { 'X-CSRF-TOKEN': '{{ csrf_token() }}' // 携带CSRF令牌 }, data: element.serializeArray(), dataType: 'json', success: function(response){ if (response["status"] == true) { $("#name").removeClass('is-invalid') .siblings('p') .removeClass('invalid-feedback').html(""); $("#slug").removeClass('is-invalid') .siblings('p') .removeClass('invalid-feedback').html(""); } else { var errors = response['errors']; if (errors['name']) { $("#name").addClass('is-invalid') .siblings('p') .addClass('invalid-feedback').html(errors['name'][0]); } else { $("#name").removeClass('is-invalid') .siblings('p') .removeClass('invalid-feedback').html(""); } if (errors['slug']) { $("#slug").addClass('is-invalid') .siblings('p') .addClass('invalid-feedback').html(errors['slug'][0]); } else { $("#slug").removeClass('is-invalid') .siblings('p') .removeClass('invalid-feedback').html(""); } } }, error: function(jqXHR, exception){ console.log("Something went wrong"); } }); });
3. 缺少CSRF令牌验证
Laravel默认会验证所有POST请求的CSRF令牌,你的AJAX请求未携带令牌,会被服务器拒绝,间接触发表单默认提交。
解决方案:
除了上述AJAX请求头的方式,也可以在表单中添加隐藏的CSRF字段,serializeArray()会自动携带:
<form> @csrf <!-- 其他表单字段 --> </form>
4. Controller代码错误
$validator->error()拼写错误,应为$validator->errors(),少一个s会导致服务器500错误;return response()->json()之后的$request->session()->flash()永远不会执行,因为return会终止代码运行。
解决方案:
修改CategoryController.php的store方法:
public function store(Request $request) { $validator = Validator::make($request->all(),[ 'name' => 'required', 'slug' =>'required|unique:categories', ]); if ($validator->passes()) { $category = new Category(); $category->name = $request->name; $category->slug = $request->slug; $category->status = $request->status ?? 0; // 增加默认值,避免字段为空 $category->save(); // 区分AJAX和普通请求的返回逻辑 if ($request->wantsJson()) { return response()->json([ 'status' => true, 'message' => 'Category Added Successfully' ]); } $request->session()->flash('success','Category Added Successfully'); return redirect()->route('categories.create'); } else { if ($request->wantsJson()) { return response()->json([ 'status' => false, 'errors' => $validator->errors() // 修正拼写错误 ]); } return back()->withErrors($validator)->withInput(); } }
5. JS方法名拼写错误
代码中removeClasss、addClasss多了一个s,正确方法名是removeClass和addClass,拼写错误会导致JS无法执行,无法阻止表单默认提交。
解决方案:
将所有removeClasss改为removeClass,addClasss改为addClass,参考上述JS代码示例。
内容的提问来源于stack exchange,提问作者keyExp

