Laravel 5.4 MethodNotAllowedHttpException

时间:2017-09-19 11:49:02

标签: php laravel laravel-5

有两个变量的路线出现问题。 我有一个删除项目的表单。

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

单击Delete后,我得到一个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&_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不存在' 我会进一步调查这个!

6 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

这种情况正在发生,因为您正在向错误的网址发出请求

必须是action="/admin/room/{{$room->id}}/image/{{$img->id}}"而不是action="/admin/room/{{$room->id}}/image/{{$img->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> 

答案 2 :(得分:1)

将表单上的方法属性设置为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 :(得分:1)

您可以使用Named Routes

obj = UserMF(request.POST)

if obj.is_valid():
    obj.save()
    xxx = obj.id

并在表单

中使用route()帮助器方法
Route::delete('room/{room}/image/{image}',
              'RoomImagesContoller@destroy')->name('deleteRoomImages');

答案 4 :(得分:0)

您可以通过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>

答案 5 :(得分:-1)

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