Laravel 中的多步表单

Posted

技术标签:

【中文标题】Laravel 中的多步表单【英文标题】:Multi-step form in Laravel 【发布时间】:2020-06-27 09:46:37 【问题描述】:

我正在尝试创建一个多步骤表单,供用户在登录后填写。我创建了单独的页面,其中包含将成为通用表单一部分的表单。

数据将保存在“用户”表中。

我是 Laravel 的新手,我遵循了这个:https://www.5balloons.info/multi-page-step-form-in-laravel-with-validation/

在我的 FormController 中,我有这些方法:

public function index(Request $request)

    $request->session()->forget('user');
    $user = User::all();
    return view('form.index',compact('user',$user));


public function updateStep1(Request $request)

    $user = $request->session()->get('user');
    return view('form.update-step1',compact('user', $user));


public function postupdateStep1(Request $request)


    $validatedData = $request->validate([
        'first_name' => 'required',
    ]);

    if(empty($request->session()->get('user')))
        $user = User::where('id',auth()->user()->id)->first();
        $user->fill($validatedData);
        $request->session()->put('user', $user);
    else
        $user = $request->session()->get('user');
        $user->fill($validatedData);
        $request->session()->put('user', $user);
    
    return redirect('/form/update-step2');



public function updateStep2(Request $request)

    $user = $request->session()->get('user');
    return view('form.update-step2',compact('user', $user));


public function postupdateStep2(Request $request)

    $validatedData = $request->validate([
        'address' => 'required',
    ]);

    if(empty($request->session()->get('user')))
        $user = User::where('id',auth()->user()->id)->first();
        $user->fill($validatedData);
        $request->session()->put('user', $user);
    else
        $user = $request->session()->get('user');
        $user->fill($validatedData);
        $request->session()->put('user', $user);
    
    return redirect('/form/store');



public function store(Request $request)

    $user = User::where('id',auth()->user()->id)->first();
    $user = $request->session()->get('user');
    $user->save();
    return redirect('/form');

这些是路线:

Route::get('/form', 'FormController@index');

Route::get('/form/update-step1', 'FormController@updateStep1');
Route::post('/form/update-step1', 'FormController@postupdateStep1');

Route::get('/form/update-step2', 'FormController@updateStep2');
Route::post('/form/update-step2', 'FormController@postupdateStep2');

Route::post('/form/store', 'FormController@store');

这是表格的第一部分:

@extends('layouts.app')

@section('content')
    <h1>update - Step 1</h1>
    <form action="/form/update-step1" method="post">
        @csrf
        <div class="form-group">
            <label for="name">First Name</label>
            <input type="text" value=" old('first_name', $user->first_name ?? null) " class="form-control" name="name">
        </div>

        @if ($errors->any())
            <div class="alert alert-danger">
                <ul>
                    @foreach ($errors->all() as $error)
                        <li> $error </li>
                    @endforeach
                </ul>
            </div>
        @endif
        <button type="submit" class="btn btn-primary">Continue</button>
    </form>
@endsection

我在尝试提交时收到错误消息,说这些字段是必填的。因此,即使我确实输入了名称等,它也不起作用。如果我删除验证,似乎一切正常,但没有数据添加到数据库中。

有什么建议吗?

【问题讨论】:

如果user 表有first_name 列,那么您的输入名称应该是first_name。如果您想更新 name 列,请更改验证名称。 【参考方案1】:

您应该使用输入名称first_name,因为您在验证中使用了first_name

<input type="text" value=" old('first_name', $user->first_name ?? null) " class="form-control" name="first_name">

如果要更改user 表中的名称值:

表单控制器

 $validatedData = $request->validate([
    'name' => 'required',
]);

表格的第一部分:

<input type="text" value=" old('name', $user->name ?? null) " class="form-control" name="name">

【讨论】:

你说得对,我错过了。我将输入名称更改为“first_name”并且验证有效。但是在最后一页,提交后出现404错误……是不是store方法有问题? 是:加载资源失败:服务器响应状态为 404(未找到)这是最后一个表单页面:
@csrf ... ...
@andrea 请更改路线Route::any('/form/store', 'FormController@store'); 使用any() 方法。 404 是因为我在表单操作中犯了一个错误。我修复它并且它有效。谢谢,阿米特。奇怪的是,现在在数据库中,只保存了first_name,而地址却没有…… @andrea address 列存在于用户表中吗?仔细检查..

以上是关于Laravel 中的多步表单的主要内容,如果未能解决你的问题,请参考以下文章

如何从 nodejs 中的多步表单发布数据并表达到 MongoDB?

ubercart 2.4 中的多步结账

枚举列laravel 8上的多项选择

django中有趣的多步表单

数组到字符串转换错误,如何使用 laravel 存储表单中的数据

使用 React 和 Django Rest 框架的多步表单处理