Laravel 5.8: 此路由不支持 POST 方法

Laravel 5.8: The POST method is not supported for this route

我在 Blade 有这样的表格:

@forelse($orders as $order)
    <form method="POST" action="{{ route('orders.newprint', ['id'=>$order->id]) }}">
        @csrf
        <tr>
            <td><input class="form-check-input" name="orderCheck[]" type="checkbox" value="{{ $order->ord_id }}">&nbsp;</td>
            <td>{{ $order->ord_id }}</td>
        </tr>
        @empty
        <td colspan="7" class="text-center">Nothing to show</td>
@endforelse

        <hr>
        <label>Actions:</label>
        <select class="form-control select2" name="actions" id="actions">
            <option value="">Select...</option>
            <option value="print_factors">Print Factors</option>
            <option value="print_orders">Print Orders</option>
        </select>
        <button class="btn btn-primary float-left">Do</button>              
    </form>

我添加了这条路线:

Route::post('orders/newprint/{order}','OrdersController@prnpriview')->name('orders.newprint')->middleware('permission:shop-manage');

控制器的方法在这里:

public function prnpriview(Request $request, Order $order)
    {
        $checks = $request->input('orderCheck');
        foreach($checks as $check){
            dd($check);
        }
    }

但是我得到这个错误:

此路由不支持 POST 方法。支持的方法:GET、HEAD、DELETE。

我不知道为什么会显示这个,因为我指定了 POST 作为路由操作!

所以如果你知道如何解决这个问题,请告诉我...

提前致谢。

当您有另一条路线以该路线开始时,就会出现此问题,例如:

Route::post('orders/newprint/...

或同名

->name('orders.newprint')

而且是在想要的路由之后定义的。


澄清:在Laravel中,当定义了相同的路由名称时,只会采用最后一个...它作为数组键原则工作...如果将相同的键压入现有数组,您最后设置的将是正在使用的那个:

$array = [
    'name' => 'route_name'
];

$array['name'] = 'some_different_name';

print_r($array);

// result
Array
(
    [name] => some_different_name
)

要匹配的模式应以正斜杠开头:'/orders/newprint/{id}'

虽然我更愿意称它为:'/orders/{id}/print'(个人喜好问题)。

在控制器中的操作 prnpriview() 中,您将 Order 对象放入参数中。您正在以表格形式发送订单 ID 变化

public function prnpriview(Request $request, Order $order)

public function prnpriview(Request $request, $order_id)

可能是您的路由方法有问题。

试试下面的东西。

 <form method="POST" action="{{ route('orders.newprintv1', $order->id) }}">

直接在操作路由中提及 id 我们不需要为单个记录使用数组。

在路线中:

Route::post('orders/newprint/{order}','OrdersController@prnpriview')->name('orders.newprintv1')->middleware('permission:shop-manage');

更改路由名称orders.newprint确保任何其他路由名称与上面的名称不同你在route.php中写入路由检查所有路由在此之前。

可能是检查资源路由?用 orders/newprint.

定义任何路线

由于这也造成了问题。

还有一点需要确认,请在不做任何更改的情况下移动现有路线 使其成为 route.php 文件顶部的第一个,这是您的第一条路线。

然后检查它是否有效,然后其他路由与同名发生冲突。

这样使用

<form method="POST" action="{{ route('orders.newprint', $order->id) }}">