Laravel form won't PATCH, only POST - nested RESTfull Controllers, MethodNotAllowedHttpException
Solution 1
In Laravel 5 and up:
<form method="POST" action="patchlink">
@method('patch')
. . .
</form>
Solution 2
Write {!! method_field('patch') !!}
after form:
<form method="POST" action="patchlink">
{!! method_field('patch') !!}
. . .
</form>
Official documentation for helper function method_field()
Solution 3
Since html forms support only GET
and POST
you need to add an extra hidden field
to the form called _method
in order to simulate a PATCH
request
<input type="hidden" name="_method" value="PATCH">
Solution 4
As suggested by @Michael A in the comment above, send it as a POST
<form method="POST" action="patchlink">
<input type="hidden" name="_method" value="PATCH">
Worked for me.
maarten
Updated on July 26, 2022Comments
-
maarten over 1 year
I am trying to allow users to edit their playlist. However, whenever I try to execute the PATCH request, I get the MethodNotAllowedHttpException error. (it is expecting a POST)
I have set up RESTful Resource Controllers:
Routes.php:
Route::resource('users', 'UsersController'); Route::resource('users.playlists', 'PlaylistsController');
This should give me access to: (as displayed through php artisan routes)
URI | Name | Action PATCH users/{users}/playlists/{playlists} | users.playlists.update | PlaylistsController@update
However, when I try to execute the following form, I get the MethodNotAllowedHttpException error:
/users/testuser/playlists/1/edit
{{ Form::open(['route' => ['users.playlists.update', $playlist->id], 'method' => 'PATCH' ]) }} {{ Form::text('title', $playlist->title) }} {{ Form::close() }}
If I remove
'method'=> 'PATCH'
I don't get an error, but it executes mypublic function store()
and not mypublic function update()
-
Michael A over 9 yearsPATCH is being added via the method option in Form::open. You could also use PUT. I am having the same inexplicable issue, no matter what I do, the PUT or PATCH methods throw the MethodNotAllowedHttpException. Very frustrating.
-
Nenad over 9 yearsTry with
Route::any('the_url_where_you_post_to', function(){});
or accordingly to the method you useRoute::patch
orRoute::put