RouteCollection.php 行 200 中的 MethodNotAllowedHttpException:

MethodNotAllowedHttpException in RouteCollection.php line 200:

我这里有这些路由声明

//Skill
Route::get('skill','SkillController@index');
Route::get('skill/create','SkillController@create');
Route::post('skill/store','SkillController@store');
Route::get('skill/{id}','SkillController@show');
Route::get('skill/{id}/edit', 'SkillController@edit');
Route::post('skill/{id}/update','SkillController@update');
Route::delete('skill/{id}/destroy','SkillController@destroy');

有了这些路由,我可以在本地删除罚款。

当我尝试在生产环境中删除时,我一直收到

我确定,我有这条线

Route::delete('skill/{id}/destroy','SkillController@destroy');

我错过了什么?

由于您的问题仅出现在 linux 服务器的生产环境中,我认为这可能是 .htaccess 问题。

通常 Web 服务器将被配置为阻止除 GET 和 POST 之外的任何内容,因为 99% 的时间它们都是需要的,并且过去存在问题,应用程序假设请求是一个这两个。

您可以尝试使用

的 .htaccess
<Limit GET POST PUT DELETE>
 Allow from all
</Limit>

(我不是 apache 专家,这可能不完全正确)

路由是从表单触发的...是吗?你的表单方法应该是 POST,而不是 DELETE 然后你应该添加一个隐藏的输入,使它作为 DELETE 路由,从而帮助你维护 Route::delete()
您的表单应如下所示:

<form action="/foo/bar" method="POST">
    <input type="hidden" name="_method" value="DELETE">

你的路线:

Route::delete('skill/{id}/destroy','SkillController@destroy');

阅读 https://laravel.com/docs/5.7/routing#form-method-spoofing 以获得更多见解。

当您在浏览器地址栏中写下您的请求时,它应该是 GET 或 POST。这就是你犯错的原因。

MethodNotAllowedHttpException: It means that the route is correct, but method is mistaken. You used POST method - this method is automatic if you use browser. But you need DELETE method.

要使用 DELETE 方法,您应该使用 API 客户端。 PhpStorm 有 API 内置 API 客户端。 PHPStorm RESTApi client docs

但是!对我来说,最好的方法是使用 PostmanPostman sending requests docs