Laravel form won't PATCH, only POST - nested RESTfull Controllers, MethodNotAllowedHttpException

18,530

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.

Share:
18,530
maarten
Author by

maarten

Updated on July 26, 2022

Comments

  • maarten
    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 my public function store() and not my public function update()

  • Michael A
    Michael A over 9 years
    PATCH 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
    Nenad over 9 years
    Try with Route::any('the_url_where_you_post_to', function(){}); or accordingly to the method you use Route::patch or Route::put