【问题标题】:laravel- 404 not found but route existlaravel- 404 未找到但路线存在
【发布时间】:2025-11-28 10:05:01
【问题描述】:

我正在尝试提交一个表单来更新我在数据库中的表并测试控制器是否正常工作,我做了一些测试。我正在学习如何使用 POST 方法传递数据。这是我的代码。

路线:

Route::prefix('dashboard')->group(function () {
    // Route for panel.
    Route::prefix('panel')->group(function () {
        // Return index home page for panel.
        Route::get('/', 'Panel\DashboardController@index');
        // Update order information (delivery date and order status)
        Route::put('/update-order-information', 'Order\OrderController@update');
    });
}

panel.blade.php(视图):

<table class="table table-light ">
    <thead class="thead-dark">
    <tr>
        <th scope="col">Order ID</th>
        <th scope="col">Delivery Date</th>
        <th scope="col">Order Info</th>
        <th scope="col">Order Status</th>
        <th scope="col">Purchase Order</th>
    </tr>
    </thead>
    <tbody>
    @foreach ($customerOrders as $customerOrder)
    <tr>
        <form action="/dashboard/panel/update-order-information/{{$customerOrder->order_id}}" method="POST">
            <input type="hidden" name="_method" value="PUT">
            <input type="hidden" name="_token" value="{{ csrf_token() }}">
            <td>{{$customerOrder->order_id}}</td>
            <td>
                <input name='delivery_date' class="date form-control" type="text" placeholder="Select delivery date"
                       autocomplete="off">
            </td>
            <td>{{$customerOrder->product_name}}</td>
            <td>
                <select id="status" name="status">
                    <option value="inProgress">In Progress</option>
                    <option value="shipped">Order Shipped</option>
                    <option value="cancelled">Cancelled</option>
                </select>
            </td>
            <td>{{$customerOrder->purchase_order}}
                <input type="submit" value="Submit">
            </td>
        </form>
    </tr>
    @endforeach
    </tbody>
</table>

OrderController.php:

/**
 * Update the specified resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function update(Request $request, $id)
{
    $order = new Order();
    findOrFail($id);
    $order->order_id = $request->input('delivery_date');
    $order->order_status = $request->input('status');
    $order->save();
}

当我点击提交按钮时,它给了我一个 404 页面。谁能指出我的错误?

【问题讨论】:

  • 而不是Route::put( 尝试Route::post( 因为您在表单上使用post 方法,我认为它应该给您,方法不允许异常而不是404
  • @AkshayKhale 我的代码逻辑正确吗?
  • 使用 Dilip 在答案中建议的方法,这是最推荐的方法之一

标签: php laravel


【解决方案1】:

尝试在表单操作中使用 URL。

<form action="{{ url('dashboard/panel/update-order-information') }}" method="POST" > 
   <input type="hidden" name="_method" value="PUT">
   <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>

或者你可以定义route name如下。

Route::put('/update-order-information', 'Order\OrderController@update')->name('update.order');

<form action="{{ route('update.order') }}" method="POST" > 
   <input type="hidden" name="_method" value="PUT">
   <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>

编辑:-

在您的控制器方法中,您期望 $id 但在 URL 中您没有传递订单 ID。

<form action="{{ route('update.order',['id'=>$customerOrder->order_id]) }}" method="POST" > 
   <input type="hidden" name="_method" value="PUT">
   <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>

Route.php

Route::put('/update-order-information/{id}', 'Order\OrderController@update')->name('update.order');

控制器。

public function update(Request $request, $id)
{
    dd("hello");
    // $panel = new Order();
    // $panel->order_id = $request->input('delivery_date');
}

【讨论】:

  • 我会推荐Named Routes
  • 它现在给了我这个错误:函数 App\Http\Controllers\Order\OrderController::update() 的参数太少,通过了 1 个,预期正好有 2 个
  • 因为在这里你传递了 id 如果你没有在 url 中传递它,也将它删除。public function update(Request $request, $id)
  • 我需要传递许多订单 ID,因为我的表格有很多行,每个订单 ID 我可以更新交货日期和订单状态。
  • 所以在数组中传递订单ID,从控制器中删除$id。在路由文件中删除 {id} 并从 url 中删除订单 ID ['id'=&gt;$customerOrder-&gt;order_id]
【解决方案2】:

像这样在你的网址前添加/

<form action="/dashboard/panel/update-order-information/{{$customerOrder->id}}" method="POST" > 

编辑:

 /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $panel = Order::findOrFail($id)
        $panel->column_in_your_database = $request->input('delivery_date');
        $panel->save();
    }  

【讨论】:

  • 函数 App\Http\Controllers\Order\OrderController::update() 的参数太少,通过了 1 个,预期正好有 2 个。新错误
  • @LordJesus 我更新了我的答案并添加了 {{$customerOrder->id}} 以满足您的需求
  • 如何将表格上的交货日期更新到我的餐桌上?
  • 我的意思是有可能在我提交后,它不会将我重定向到另一个页面,而只是获取用户的 id 并更新日期?
  • 用php你不能你需要使用ajax这里是一个介绍w3schools.com/jquery/jquery_ajax_intro.asp