【问题标题】:how to update database using laravel controller? MethodNotAllowedHttpException No message error message如何使用 laravel 控制器更新数据库? MethodNotAllowedHttpException 无消息错误消息
【发布时间】:2018-10-07 16:26:27
【问题描述】:

我正在尝试使用我的表格更新我的数据库 edit.blade.php 页面如下图所示。编辑部分正常工作,因为字段按预期填写在表单中,但是当我尝试保存时,出现

的错误消息

Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException 没有消息

显示。我已经尝试了很多方法来解决它,但我不确定我哪里出错了。希望它是简单的修复?

edit.blade.php

@extends('layouts.app')

    <!-- Styles -->
        <link href="{{ asset('css/app.css') }}" rel="stylesheet">

    @section('content')
    <div class="container">
        <div class="row justify-content-center">
            <div class="col-md-8">


            <form method="post" action="{{ action('PostsController@update', $id) }}">

                {{ csrf_field() }}
                <input type="hidden" name="_method" value="PATCH" />

            <h1>Edit Item</h1>
            <div class="form-group">

                <label for="item">Item:</label>

                <input type="text" id="item" name="item" value="{{$post->item}}" class="form-control" required>

            </div>



            <div class="form-group">

                        <label for="weight">Weight (g):</label>

                        <input type="number" id="weight" value="{{$post->weight}}" name="weight" class="form-control">

            </div>



            <div class="form-group">

                        <label for="noofservings">No of Servings:</label>

                        <input type="number" id="noofservings" value="{{$post->noofservings}}" name="noofservings" class="form-control">

            </div>



            <div class="form-group">

                        <label for="calories">Calories (kcal):</label>

                        <input type="number" id="calories" name="calories" value="{{$post->calories}}" class="form-control">

            </div>



            <div class="form-group">

                        <label for="fat">Fat (g):</label>

                        <input type="number" id="fat" name="fat" value="{{$post->fat}}" class="form-control">

            </div>



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


        </form>

            </div>
        </div>
    </div>
@endsection

PostsController.php

<?php
public function update(Request $request, $id)
    {

        $this->validate('$request', [

            'item' => 'required'

        ]);

         $post = Post::find($id);
         $post->item = $request->input('item');
         $post->weight = $request->input('weight');
         $post->noofservings = $request->input('noofservings'); 
         $post->calories = $request->input('calories');
         $post->fat = $request->input('fat');
         $post->save();

         return redirect('/foodlog');
    }

web.php

<?php
Route::get('edit/{id}', 'PostsController@edit');

Route::put('/edit', 'PostsController@update');

Post.php

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{

    protected $fillable = [

        'id',
        'user_id',
        'item',
        'weight',
        'noofservings', 
        'calories',
        'fat',
        'created_at'
    ]; 

}

我的网站是一个食物日志应用程序,这个功能是为了让他们可以编辑他们的日志。

非常感谢任何帮助!

【问题讨论】:

    标签: php laravel controller put


    【解决方案1】:

    根据 Michael Czechowski,我编辑了我的答案以使这个答案更好,主要问题在于您的路线:

    Route::put('/edit/{id}', 'PostsController@update');
    

    您也必须在路由参数中添加 id。您的 update() 函数需要两个参数,第一个是公式中的表单参数,第二个是已编辑日志条目的 $id。

    第二个问题是,表单方法字段是'patch',而你的路由方法是'put'。

    'patch'和'put'的区别是:

    put:获取数据并更新行,并根据您要更新的数据在数据库中创建新行。

    patch:只是更新行,并不会创建新行。

    因此,如果您只想更新旧行,请将路由方法更改为 patch。

    或者,如果您真的想放置数据,只需更改表单中的放置方法字段。

    只需:{{method_field('PUT')}}

    记住,表单和路由的方法必须相同。如果放了form的方法,就必须放route方法;反之亦然。

    【讨论】:

    • 仍然收到这个错误信息 Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException No message
    • @GemmaM 这是不可能的。记住表单和路由的方法必须相同。如果表单的方法被放置,则必须放置路由方法,反之亦然。
    • @GemmaM 为什么不用 laravel 的路由命名和模型绑定?
    • @GemmaM 检查 Michael Czechowski 的回答
    • 混合了这三种,并删除了验证,我似乎已经让它工作了......谢谢!
    【解决方案2】:

    主要问题在于您的路线:

    Route::put('/edit/{id}', 'PostsController@update');
    

    您也必须在路由参数中添加id。您的update() 函数需要两个参数,第一个是公式中的表单参数,第二个是编辑后日志条目的$id

    第二个在您的 HTML 模板中:

    <input type="hidden" name="_method" value="PUT" />
    

    要找到正确的路线,您必须将相应的method 添加到您的路线Route::put('/edit/{id}', 'PostsController@update');

    可能的最后一个问题

    <form method="post" action="{{ action('PostsController@update', $post->id) }}">
    

    我不确定您的模板是如何工作的,但$id 可能未在您的模板中设置。也许尝试根据您的帖子指定 ID。只是为了确保 ID 来自显示的帖子。

    进一步的建议

    最佳实践是使用 symfony 内置的 FormBuilder。这样可以更轻松地定位PUTPATCHOPTIONSDELETE 等特殊请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      • 2019-05-18
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 2019-05-07
      相关资源
      最近更新 更多