【问题标题】:Laravel 8 form to update databaseLaravel 8 表格更新数据库
【发布时间】:2021-04-27 22:31:39
【问题描述】:

我正在 Laravel 8 中创建一个具有 CRUD 功能的简单博客站点。我在使用已弃用的 Laravel 表单之前已经完成了这项工作,但现在我正在尝试使用 HTML 表单来完成这项工作。
但是,我在网站的更新部分遇到了一些问题。我有一个名为 BlogsController 的控制器,它调用这个函数来更新数据库中的博客,当用户提交要更新的表单时应该调用它。

BlogsController 更新功能

public function update(Request $request, $id)
    {
        $this->validate($request, [
            'title' => 'required',
            'body' => 'required',
            'category' => 'required',
            'description' => 'required',    
            'read_time' => 'required'        
        ]);

        $blog = Blog::find($id);        
        $blog->title = $request->input('title');        
        $blog->body = $request->input('body'); 
        $blog->category = $request->input('category');
        $blog->description = $request->input('description');
        $blog->read_time = $request->input('read_time');     
        $blog->user_id = auth()->user()->id;
        $blog->save();

        return redirect('/dashboard')->with('success', 'Blog Updated');
    }

表单需要指向什么操作?

更新表单顶部

<form method="POST" action="update">

web.php 中的路由

Route::resource('blog', 'App\Http\Controllers\BlogsController');

在 Laravel 表单中的实现

{!! Form::open(['action' => ['App\Http\Controllers\BlogsController@update', $blog->id], 'method' => 'POST']) !!}

【问题讨论】:

标签: php html laravel forms


【解决方案1】:

查看所有路线列表:

        $ php artisan route:list

你的路线应该是这样的:

        <form method="POST" action="{{ route('blog.update', ['blog' => $blog]) }}">              
           {{csrf_field()}}
           {{ method_field('PATCH') }}
        </form> 

【讨论】:

    【解决方案2】:

    您还可以选择使用action 获取已注册路由的 URL:

    action('App\Http\Controllers\BlogsController@update', ['blog' => $blog])
    

    【讨论】:

      【解决方案3】:

      我假设您正在为您的 CRUD 功能使用资源路由。在这种情况下,资源控制器中的 Update 方法通过 PUT 方法而不是 POST 调用。因此,在您的表单中,只需添加以下内容即可将表单提交方法更改为 PUT:

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

      此外,在您的表单声明中,您必须像这样添加目标路线:

      <form method="POST" action="{{ route('blog.update', $blog->id) }}">
      

      【讨论】:

        【解决方案4】:

        Laravel 的一个很酷的地方是 Route model binding。那是什么意思?我们可以在你的update 方法中做这样的事情

        // BlogController.php
        
        public function update(Request $request, Blog $blog) {
            $request->validate([
                'title' => 'required',
                'body' => 'required',
                'category' => 'required',
                'description' => 'required',    
                'read_time' => 'required' 
            ]);
        
            $blog->title = $request->title;
            $blog->body = $request->body;
            $blog->category = $request->category;
            $blog->description = $request->description;
            $blog->read_time = $request->read_time;
        
            if ($blog->save()) {
                return redirect('/dashboard')->with('success', 'Blog Updated');
            } else {
                // handle error.
            }
        }
        
        

        在您的模板中,您需要确保您使用的是PATCH 方法:

        <form method="POST" action="{{ route('blog.update', ['blog' => $blog]) }}">
            @csrf
            @method('PATCH')
            ...
        </form>
        

        【讨论】:

          【解决方案5】:

          你可以通过运行获取所有应用程序路由和名称的列表

          $ php artisan route:list
          

          对于您的博客更新路线,您应该使用

          <form method="POST" action="{{ route('blog.update', ['blog' => $blog]) }}">
            @method('PATCH')
          </form>
          

          在您的模板中。

          确保使用 @csrf 在表单中正确设置了 csrf 令牌,请参阅 Laravel 文档。

          【讨论】:

          • 谢谢,成功了。我现在正在尝试为删除做类似的事情,但由于某种原因,我只是被重定向到显示帖子而不是删除它。知道我做错了什么吗? &lt;form method="DELETE" action="{{ route('blog.destroy', ['blog' =&gt; $blog]) }}"&gt; &lt;input type="submit" value="Delete"&gt; &lt;/form&gt;
          • 删除使用相同的语法:method="post"@method('DELETE')
          • @ThomasRead 您应该添加 csrf 令牌......当您打开表单时,表单构建器会为您添加这个
          猜你喜欢
          • 1970-01-01
          • 2021-08-10
          • 2021-06-03
          • 2022-01-27
          • 1970-01-01
          • 1970-01-01
          • 2021-05-25
          • 2021-01-10
          • 1970-01-01
          相关资源
          最近更新 更多