在route :: resource上使用Patch的Laravel 5.2 MethodNotAllowedHttpException

时间:2016-03-08 21:56:11

标签: forms routes crud laravel-5.2

我想更新帖子。创建和删除帖子非常有效,但每当我尝试使用PATCH表单更新帖子时,它都会失败并提供MethodNotAllowedHttpException

我的routes.php:

...
Route::resource('posts', 'PostsController');
... 

这给了我以下可能的路线列表(粘贴在css中以保持可读性):

| GET|HEAD  | posts                    | posts.index          | App\Http\Controllers\PostsController@index   
| POST      | posts                    | posts.store          | App\Http\Controllers\PostsController@store    
| GET|HEAD  | posts/create             | posts.create         | App\Http\Controllers\PostsController@create     
| GET|HEAD  | posts/{posts}            | posts.show           | App\Http\Controllers\PostsController@show        
| DELETE    | posts/{posts}            | posts.destroy        | App\Http\Controllers\PostsController@destroy        
| PUT|PATCH | posts/{posts}            | posts.update         | App\Http\Controllers\PostsController@update      
| GET|HEAD  | posts/{posts}/edit       | posts.edit           | App\Http\Controllers\PostsController@edit   

我的edit.blade.php(url = localhost:8000 / posts / 1 / edit):

 {!! Form::model($post, ['method' => 'PATCH', 'action' => ['PostsController@update', $post]]) !!}
        @include('posts/_form', array('submitText' => 'Update'))
   {!! Form::close() !!}

我的PostsController:

public function update(Request $request, Post $post) {
        $post->update($request->all());
         return Redirect::route('posts.index')->with('message_succes', 'Post updated');
}

无论我尝试什么,它都失败了

  

MethodNotAllowedHttpException   RouteCollection-> methodNotAllowed(array('GET','HEAD','POST'))in   RouteCollection.php第206行

查看表单的html源,正确插入PATCH和令牌。 将PATCH更改为在表单中发布时,它将使用商店功能并创建新帖子。我需要做些什么来更新帖子?

4 个答案:

答案 0 :(得分:1)

原来我发布了完整的对象,而不仅仅是ID。 我不得不改变:

表单中的

$post$post->id,并且PostController更新为:

  public function update(Request $request, $post_id) {
        $post = Post::findOrFail($post_id)
        $post->update($request->all());
         return Redirect::route('posts.index')->with('message_succes', 'Post updated');
}

答案 1 :(得分:0)

尝试将PATCH方法更改为以下格式:

{!! Form::model($post, ['method' => 'PUT', 'action' => ['PostsController@update', $post]]) !!}
    @include('posts/_form', array('submitText' => 'Update'))
{!! Form::close() !!}

答案 2 :(得分:0)

对于那些忘记指定编辑表格的行动/路线的人,即:

{!! Form::model($post, ['method' => 'PATCH']) !!}
    ...
    Form controls
    ...
{!! Form::close() !!}

如果您未在update页面上明确指定edit表单操作,Form::model()将使用当前路由,例如<site>/posts/<id>/edit。所以,不要忘记真实的update行动地点,要么通过路线:

{!! Form::model($post, ['method' => 'PATCH', 'route' => ['posts.update', $post]]) !!}
    ...
    Form controls
    ...
{!! Form::close() !!}

...我个人更喜欢,&#39;更通用,或通过行动:

{!! Form::model($post, ['method' => 'PATCH', 'action' => ['PostsController@update', $post->id]]) !!}
    ...
    Form controls
    ...
{!! Form::close() !!}

......这有点过于冗长和具体。

答案 3 :(得分:-1)

很好,你是对的!但你评论反向,$ post-&gt; id到$ post然后控制器将使用整个对象而不是单个。现在在这里工作。谢谢!