You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 01:10:25