Home > Blockchain >  Why does Laravel say that my "update" method is not a support route?
Why does Laravel say that my "update" method is not a support route?

Time:04-25

I am getting this error when I try to use update method from my routes.

The UPDATE method is not supported for this route. Supported methods: GET, HEAD, POST, DELETE.

I am building my project using Laravel and have defined update by route in web.php

Route::get('/{post:slug}', [PostController::class, 'show']);
Route::delete('/{post:slug}', [PostController::class, 'destroy']);
Route::post('/{post:slug}', [PostController::class, 'create']);
Route::post('/{post:slug}', [PostController::class, 'update']);

And my update function in PostController.php should just ddd.

public function UPDATE(Post $post)
    {
        ddd(request(),$post);
    }

and as far as I have seen so long as I have @csrf and method("UPDATE") everything should be good. This is on my posts.show.blade.php

<form method="POST" action="/{{$post->slug}}">
    @csrf
    @method("UPDATE") 

I'm new to Laravel and MVC; where have I gone wrong or what am I missing? On the page where this is failing I have two modal forms, one to update/edit and one to delete. The delete method works just fine but update fails with the same setup.

To also be clear, these forms are on /{{$post->slug}} could the issue be that I am trying to route to /{{$post->slug}}/{{$post->slug}} with the form action so that then throws off the route?

CodePudding user response:

As a user already stated, you have to use the Route::xxxx you choose, so your HTML should be like:

<form method="POST" action="/{{$post->slug}}">
    @csrf

BUT, you have 2 equal routes (string) but pointing to the different controller's methods:

Route::post('/{post:slug}', [PostController::class, 'create']);
Route::post('/{post:slug}', [PostController::class, 'update']);

The convention/standard here is to:

Verb URI Action Route Name
GET /posts index posts.index
GET /posts/create create posts.create
POST /posts store posts.store
GET /posts/{post} show posts.show
GET /posts/{post}/edit edit posts.edit
PUT/PATCH /posts/{post} update posts.update
DELETE /posts/{post} destroy posts.destroy

So, you should have:

Route::get('/posts/{post:slug}', [PostController::class, 'show']);
Route::post('/posts/create', [PostController::class, 'create']);
Route::put('/posts/{post:slug}', [PostController::class, 'update']);
Route::delete('/posts/{post:slug}', [PostController::class, 'destroy']);

If you have the routes above, then you have to:

<form method="POST" action="/posts/{{$post->slug}}">
    @csrf
    @method('PUT')

Read Actions Handled By Resource Controller for more information.

More info about @method so you don't confuse what it means.

CodePudding user response:

Update your "update" route into being either a PUT or PATCH request that way it's able to distinguish between your two "POST" routes.

  • Related