Laravel 5.4 - 更新资源

时间:2017-07-03 10:46:23

标签: laravel crud laravel-5.4

我正在建立一篇博客文章来学习Laravel 5.4,并且正在努力寻找如何在任何地方更新帖子的任何示例。

我的表格如下

<form method="POST" action="/posts/{{ $post->id }}/edit">
    {{ csrf_field() }}

    <div class="form-group">
        <label for="title">Title</label>
        <input name="title" type="text" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" value="{{ $post->title }}" required>
    </div>
    <div class="form-group">
        <label for="description">Description</label>
        <input name="description" type="text" class="form-control" id="exampleInputPassword1" value="{{ $post->title }}" required>
    </div>

    <div class="form-group">
        <button type="submit" class="btn btn-primary">Update</button>
    </div>
</form>

我的路线如下

Route::get('/posts/{post}/edit', 'PostsController@edit');

Route::patch('/posts/{post}', 'PostsController@update');

我的控制器方法是

public function edit( Post $post )
{
    return view('posts.edit', compact('post'));
}

public function update(Request $request, Post $post )
{
    Post::where('id', $post)->update($request->all());

    return redirect('home');

}

我收到MethodNotAllowedHTTPException错误,但我不确定这个部分/部分是否出错。

我假设它必须是我使用PATCH功能的点,或者可能只是我批量分配新值的方式。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:6)

你应该使用

{{ method_field('PATCH') }}

作为表单字段

并将操作更改为

/posts/{{ $post->id }}
像这样:

<form method="POST" action="/posts/{{ $post->id }}">

        {{ csrf_field() }}
{{ method_field('PATCH') }}
        <div class="form-group">
            <label for="title">Title</label>
            <input name="title" type="text" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" value="{{ $post->title }}" required>
        </div>
        <div class="form-group">
            <label for="description">Description</label>
            <input name="description" type="text" class="form-control" id="exampleInputPassword1" value="{{ $post->title }}" required>
        </div>

        <div class="form-group">

            <button type="submit" class="btn btn-primary">Update</button>

        </div>

    </form>

答案 1 :(得分:3)

有几件事你错过了。

首先,正如@Maraboc在评论中指出的那样,您需要添加方法欺骗,因为标准HTML表单只允许使用GETPOST方法:

<input type="hidden" name="_method" value="PATCH">

{{ method_field('PATCH') }}

https://laravel.com/docs/5.4/routing#form-method-spoofing

然后你还需要省略&#34;编辑&#34;你的表格行动中的uri:

<form method="POST" action="/posts/{{ $post->id }}">

<form method="POST" action="{{ url('posts/' . $post->id) }}">

https://laravel.com/docs/5.4/controllers#resource-controllers

(向下滚动一下<资源控制器处理的操作部分)

您也可能会发现观看https://laracasts.com/series/laravel-5-from-scratch/episodes/10

会很有帮助

希望这有帮助!

答案 2 :(得分:0)

构建API时,您可能需要一个转换层,该转换层位于Eloquent模型和实际返回给应用程序用户的JSON响应之间。 Laravel的资源类使您可以表达而轻松地将模型和模型集合转换为JSON。