Laravel路由错误:GET方法不支持/produk/index,请求协助解决
Laravel路由方法不支持错误解决
错误信息
The GET method is not supported for route produk/index. Supported methods: POST.
用户提供的代码
web.php 路由配置
<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\LoginController; use App\Http\Controllers\ProdukController; use App\Http\Controllers\SupplierController; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider and all of them will | be assigned to the "web" middleware group. Make something great! | */ Route::get('/home', function () { return view('partials/main');})->middleware('auth'); Route::get('/login', [LoginController::class, 'index'])->name('login')->middleware('guest'); Route::post('/login', [LoginController::class, 'authenticate']); Route::get('/logout', [LoginController::class, 'logout']); Route::get('/produk/data', [ProdukController::class, 'show'])->name('produk.data'); Route::post('/produk/index', [ProdukController::class,'index'])->name('produk.index'); Route::get('/supplier/data', [SupplierController::class, 'index'])->name('supplier.data');
ProdukController.php 控制器代码
<?php namespace App\Http\Controllers; use App\Models\Produk; use Illuminate\Http\Request; use Illuminate\Routing\Controller; class ProdukController extends Controller { public function show() { return view('kategori.kategori'); } public function index(Request $request) { // dd($request); $ValidateData = $request->validate([ 'nama_produk' => ['required','max:255'], 'harga_beli' => ['required'], 'harga_jual' => ['required'], 'stok' => ['required'] ]); Produk::create($ValidateData); return view('kategori.index')->with('succes'); } };
index.blade.php 视图代码
<!doctype html> <html lang="en"> <head> <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- Bootstrap CSS --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"> <link rel="stylesheet" href="{{ asset('css/bootstrap.min.css') }}"> <link rel="stylesheet" href="{{ asset('css/style.css') }}"> <title>Form Produk</title> </head> <body> {{-- @foreach ($produks as $produk ) --}} {{-- @endforeach --}} <div class="col-6 mx-auto"> <div class="container bg-white"> <form action="/produk/index" method="POST"> @csrf <div class="mb-3"> <label for="exampleFormControlInput1" class="form-label">Nama Produk</label> <input class="form-control" name="nama_produk" id="exampleFormControlInput1" placeholder="nama produk"> </div> <div class="mb-3"> <label for="exampleFormControlInput1" class="form-label">Harga Beli</label> <input class="form-control" name="harga_beli" id="exampleFormControlInput1" placeholder="harga beli"> </div> <div class="mb-3"> <label for="exampleFormControlInput1" class="form-label">Harga Jual</label> <input class="form-control" name="harga_jual" id="exampleFormControlInput1" placeholder="harga jual"> </div> <div class="mb-2"> <label for="exampleFormControlInput1" class="form-label">Stok</label> <input class="form-control" name="stok" id="exampleFormControlInput1" placeholder="stok"> </div> <button onclick="" class="btn btn-success mt-3 mx-auto mb-3 text-center" type="submit"><i class="bi bi-plus-lg"></i> Tambah</button> </form> </div> </div> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js" integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js" integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF" crossorigin="anonymous"></script> </body> </html> </body> </html>
问题原因
- 路由配置错误:将展示表单的路由设置为
POST方法,但浏览器访问表单页面发送的是GET请求,导致方法不匹配报错。 - 控制器方法职责混乱:违背Laravel常规约定,用
index方法处理表单提交(创建数据),而非展示资源列表。 - 提交后返回逻辑不合理:直接返回视图不符合Post/Redirect/Get(PRG)模式,会导致用户刷新页面重复提交数据。
解决方案
1. 修正路由配置
调整路由,用GET路由展示表单,新增POST路由处理提交,遵循Laravel命名规范:
// web.php Route::get('/produk/index', [ProdukController::class,'create'])->name('produk.create'); Route::post('/produk', [ProdukController::class,'store'])->name('produk.store'); // 保留原有其他路由 Route::get('/produk/data', [ProdukController::class, 'show'])->name('produk.data'); Route::get('/supplier/data', [SupplierController::class, 'index'])->name('supplier.data');
2. 调整控制器方法
拆分职责,新增create方法展示表单,store方法处理数据创建,采用重定向避免重复提交:
<?php namespace App\Http\Controllers; use App\Models\Produk; use Illuminate\Http\Request; use Illuminate\Routing\Controller; class ProdukController extends Controller { public function show() { return view('kategori.kategori'); } // 展示创建产品的表单 public function create() { return view('kategori.index'); } // 处理表单提交,创建产品数据 public function store(Request $request) { $ValidateData = $request->validate([ 'nama_produk' => ['required','max:255'], 'harga_beli' => ['required'], 'harga_jual' => ['required'], 'stok' => ['required'] ]); Produk::create($ValidateData); // 重定向回表单页面,并携带成功提示 return redirect()->route('produk.create')->with('success', '产品添加成功'); } };
3. 更新视图的表单提交地址
将表单action改为路由名称,避免硬编码路径:
<form action="{{ route('produk.store') }}" method="POST"> @csrf <!-- 原有表单内容保持不变 --> </form>
4. 新增成功提示(可选)
在视图中添加提示信息,反馈操作结果:
<div class="col-6 mx-auto"> @if(session('success')) <div class="alert alert-success mb-3"> {{ session('success') }} </div> @endif <div class="container bg-white"> <!-- 表单内容 --> </div> </div>
内容的提问来源于stack exchange,提问作者Daffa naufas Setiawan
相关产品推荐
相关产品推荐

