【问题标题】:Laravel 5.4 MethodNotAllowedHttpExceptionLaravel 5.4 MethodNotAllowedHttpException
【发布时间】:2018-02-28 04:39:21
【问题描述】:

有两个变量的路线有问题。 我有一个表格可以删除一个项目。

<form action="/admin/room/{{$room->id}}/image/{{$img->id}}/">
    {{method_field('DELETE')}}
    {{csrf_field()}}
    <input class="btn btn-danger" type="submit" value="Delete">
</form>

点击删除后,我得到一个 MethodNotAllowedHttpException。

这是我的路线文件。

//authenticated users only
Route::group(['middleware' => 'auth'], function ()
{
    Route::prefix('admin')->group(function () 
    {
        /*Some other routes*/

        //Matches "/admin/room/{room}/image[s]?"
        Route::get('room/{room}/image', 'RoomImagesController@index')
        ->name('admin.roomimages');
        Route::get('room/{room}/image/create','RoomImagesController@create');
        Route::post('room/{room}/image','RoomImagesController@store');
        Route::delete('room/{room}/image/{image}','RoomImagesContoller@destroy');

        //Matches the "/admin/room[s]?" URL
        Route::get('/rooms', 'AdminController@rooms');      
        Route::get('/room/create', 'RoomController@create');
        Route::get('/room/{room}', 'RoomController@edit');  
        Route::post('/room/search','RoomController@search');
        Route::post('/room/store', 'RoomController@store'); 
        Route::post('/room/{room}','RoomController@update');    
        Route::delete('/room/{room}','RoomController@destroy');
        
        /*some more routes.*/
    }
}

还有我的 RoomImagesController 类

class RoomImagesController extends Controller
{
    /*Other Methods*/
    public function destroy(Room $room, RoomImage $image)
    {
        dd($room, $image);
    }
}

我发送到的网址是:

http://domain.name/admin/room/1/image/1?_method=DELETE&amp;_token=/*tokenValue*/

不知道为什么我在这里遇到问题!如果有人能提供一些启示,我将不胜感激。如果您需要更多信息,请告诉我。


编辑

我在表单中添加了 method="post",但出现了同样的错误。这是网页上的原始粘贴。

<form method="post" action="/admin/room/1/image/4/">
    <input name="_method" value="DELETE" type="hidden">
    <input name="_token" value="lFrYPuzz8pY4EEJZEKCtZgjGM4dkk6uTD3p0jhpK" type="hidden">
    <input class="btn btn-danger" value="Delete" type="submit">
</form>

编辑 2

命名路线似乎是一种解决方案!

//web.php
Route::post('room/{room}/image/{image}','RoomImagesContoller@delete')
    ->name('admin.deleteRoomImages');

//x.blade.php
<form action="{{ route('admin.deleteRoomImages', [ 
                        'room'  => $room->id, 
                        'image' => $img->id ]) }}/"
      method="POST">
    {{ method_field('DELETE') }}
    {{ csrf_field() }}
    <input class="btn btn-danger" type="submit" value="Delete">
</form>

但我仍然得到 MethodNotAllowedError

当我运行php artisan route:list 时可能值得注意的是,我发现我得到一个 ReflectionError 'RoomImagesController 不存在' 我会进一步调查!

【问题讨论】:

  • 你确定你得到的是http://domain.name/admin/room/1/image/1?_method=DELETE&amp;_token=/*tokenValue*/ url吗?
  • 这里粘贴(不包括域)/admin/room/1/image/4?_method=DELETE&amp;_token=lFrYPuzz8pY4EEJZEKCtZgjGM4dkk6uTD3p0jhpK
  • 尝试将{{method_field('DELETE')}}改为{{ method_field('delete') }}
  • Ashish,我已经这样做了&lt;input name="_method" value="delete" type="hidden"&gt;,没有任何变化。
  • 尝试action="/admin/room/{{$room-&gt;id}}/image/{{$img-&gt;id}}"删除最后一个slash

标签: php laravel laravel-5


【解决方案1】:

method="post" 作为属性添加到您的表单。像这样:

<form action="/admin/room/{{$room->id}}/image/{{$img->id}}" method="post">

如果未提供method 属性,则默认通过GET 提交表单。 DELETE方法需要通过POST提交数据。

【讨论】:

  • @UnnecessaryMoney 尝试使用php artisan route:clear 清除缓存的路由,如果这不起作用,您可能也想使用php artisan view:clear 清除缓存的视图,那么您可以创建一个简单的路由并返回一个字符串做一步一步调试。我认为添加正确的方法应该没有问题。
【解决方案2】:

将表单上的方法属性设置为 POST 所以你有

<form action="/admin/room/{{$room->id}}/image/{{$img->id}}/" method="POST">
    {{method_field('DELETE')}}
    {{csrf_field()}}
    <input class="btn btn-danger" type="submit" value="Delete">
</form>

【讨论】:

  • 如果请求被重定向到移动的页面,它如何工作
  • 真的不明白。你能进一步解释一下吗?
【解决方案3】:

您可以通过POST 方法通过method="POST" 并在表单标签内添加删除方法隐藏字段来实现

<form action="/admin/room/{{$room->id}}/image/{{$img->id}}/" method="post">
    {{method_field('DELETE')}}
    {{csrf_field()}}
    <input class="btn btn-danger" type="submit" value="Delete">
</form>

【讨论】:

    【解决方案4】:

    你可以使用Named Routes

    Route::delete('room/{room}/image/{image}',
                  'RoomImagesContoller@destroy')->name('deleteRoomImages');
    

    并在表单中使用 route() 辅助方法

    <form action="{{ route('deleteRoomImages', [ 
                    'room'  => $room->id, 
                    'image' => $img->id ]) }}/" method="POST">
        {{ method_field('DELETE') }}
        {{ csrf_field() }}
        <input class="btn btn-danger" type="submit" value="Delete">
    </form>
    

    【讨论】:

      【解决方案5】:

      运行 composer dump-autoload 以清除 ReflectionException。 如果您复制了类文件并对其进行了修改,请验证该类的名称是 RoomImagesController 并运行 composer dump-autoload。 祝你好运!

      【讨论】:

      • 只是为了留个言,我认为应该修改没有评论的投票。另外@KunsalAjay,您可以对您的答案进行修改以反映 OP 遇到的问题之一(即您有这种答案的原因),也许下次您可以对您给出答案的原因进行一些描述,以便它可能看起来很完整,避免被否决。
      【解决方案6】:

      这是因为您向错误的 url 发出请求

      必须是action="/admin/room/{{$room-&gt;id}}/image/{{$img-&gt;id}}" 而不是action="/admin/room/{{$room-&gt;id}}/image/{{$img-&gt;id}}/"

      为什么会发生您向action="/admin/room/1/image/4/" 发出请求,该请求显示已移至action="/admin/room/1/image/4",而您丢失了DELETE 的方法字段,这就是为什么您遇到错误尝试使用下面的示例,它会正常工作.

      <form action="/admin/room/{{$room->id}}/image/{{$img->id}}" method="post">
          {{method_field('DELETE')}}
          {{csrf_field()}}
          <input class="btn btn-danger" type="submit" value="Delete">
      </form> 
      

      【讨论】:

      • 我认为这可能是正确的,因为尾部斜杠
      • 阿杰,谢谢。这就是原因。我以为我已经做到了,我关注了 linktoahref's 答案,其中包含尾随 /。我最好注意简历上的细节。
      猜你喜欢
      • 2017-12-21
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      • 2018-04-13
      • 1970-01-01
      • 2018-05-28
      • 2018-07-19
      • 1970-01-01
      相关资源
      最近更新 更多