Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel 5.4 MethodNotAllowedHttpException

Having trouble with a route with two variables. I've got a form to delete an item.

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

Upon clicking Delete, I get a MethodNotAllowedHttpException.

Here's my routes file.

//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.*/
    }
}

And my RoomImagesController class

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

The URL I'm sent to is:

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

Not sure why I'm having issues here! If anyone could shed some light I'd appreciate it. Let me know if you need any more information.


Edit

I've added method="post" to the form, with the same error. Here's a raw paste from the webpage.

<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>

Edit 2

Named routes seemed like a solution!

//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>

But I still get the MethodNotAllowedError

It may be worth noting when I ran php artisan route:list I've found that i get a ReflectionError 'RoomImagesController does not exist' I'll investigate this further!

like image 230
spkvn Avatar asked Aug 09 '26 18:08

spkvn


2 Answers

Add method="post" as an attribute to your form. Like so:

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

If the method attribute is not provided, the form is submitted via GET by default. DELETE method requires the data to be submitted via POST.

like image 114
Oluwatobi Samuel Omisakin Avatar answered Aug 12 '26 12:08

Oluwatobi Samuel Omisakin


this is happening because you are making a request to wrong url

it must be action="/admin/room/{{$room->id}}/image/{{$img->id}}" not action="/admin/room/{{$room->id}}/image/{{$img->id}}/"

why it is happening you made a request to action="/admin/room/1/image/4/" which is being showing moved to action="/admin/room/1/image/4" and you lose method field which is DELETE that's why you are getting error try to use below example and it will work fine.

<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> 
like image 22
Ajay Kumar Avatar answered Aug 12 '26 13:08

Ajay Kumar



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!