在Laravel中跨多个步骤保留表单数据

 爱到最后还是分离_851 发布于 2023-01-18 13:16

当我在过去创建多步表单时,我通常会在将表单数据返回到视图之前将其存储在会话中,这样,如果用户刷新页面或单击浏览器的本机后退按钮,数据就会持续存在.

将我过去的逻辑转移到Laravel我构建了以下三个阶段的形式:

[Input -> Confirm -> Success]

routes.php文件

Route::group(array('prefix' => 'account'), function(){
    Route::get('register', array(
        'before'  => 'guest',
        'as'      => 'account-create',
        'uses'    => 'AccountController@getCreate'
    ));

    Route::post('register', array(
        'before'  => 'guest|csrf',
        'as'      => 'account-create-post',
        'uses'    => 'AccountController@postCreate'
    ));

    Route::get('register/confirm', array(
        'before'  => 'guest',
        'as'      => 'account-create-confirm',
        'uses'    => 'AccountController@getCreateConfirm'
    ));

    Route::post('register/confirm', array(
        'before'  => 'guest|csrf',
        'as'      => 'account-create-confirm-post',
        'uses'    => 'AccountController@postCreateConfirm'
    ));

    Route::get('register/complete', array(
        'before'  => 'guest',
        'as'      => 'account-create-complete',
        'uses'    => 'AccountController@getCreateComplete'
    ));
});

AccountController.php

form_session)) 
      {
          // get forms session data
          $data = Session::get($this->form_session);

          // clear forms session data
          Session::forget($this->form_session);

          // load the form view /w the session data as input
          return View::make('account.create')->with('input',$data);
      }

      return View::make('account.create');
  }

  public function postCreate() 
  {
      // set the form input to the session
      Session::set($this->form_session, Input::all());

      $validation_rules = array(
          'email'         => 'required|max:50|email|unique:users',
          'password'      => 'required|max:60|min:6',
          'password_conf' => 'required|max:60|same:password'                    
      );

      $validator = Validator::make(Input::all(), $validation_rules);

      // get forms session data
      $data = Session::get($this->form_session);

      // Return back to form w/ validation errors & session data as input
      if($validator->fails()) {
        return  Redirect::back()->withErrors($validator);
      } 

      // redirect to the confirm step
      return Redirect::route('account-create-confirm');
  }

  public function getCreateConfirm() 
  {
      // prevent access without filling out step1
      if(!Session::has($this->form_session)) {
        return Redirect::route('account-create');
      }

      // get forms session data
      $data = Session::get($this->form_session);

      // retun the confirm view w/ session data as input
      return View::make('account.create-confirm')->with('input', $data);
  }

  public function postCreateConfirm() 
  {
      $data = Session::get($this->form_session);

      // insert into DB
      // send emails 
      // etc.

      // clear forms session data
      Session::forget($this->form_session);

      // redirect to the complete/success step
      return Redirect::route('account-create-complete');
  }

  public function getCreateComplete() {
      return View::make('account.create-complete');
  }
}

create.blade.php

Email: @if($errors->has('email')) {{ $errors->first('email') }} @endif
Password: @if($errors->has('password')) {{ $errors->first('password') }} @endif
Password Confirm: @if($errors->has('password_conf')) {{ $errors->first('password_conf') }} @endif
{{ Form::token() }}

创建-confirm.blade.php

Email: {{ $input['email']; }}
Password: {{ $input['password']; }}

{{ Form::token() }} return

以上工作正常,但我想知道这是否是在Laravel中处理多步形式的最佳方法?

1 个回答
  • 当我创建多部分表单时,我总是以某种方式完成它,以便用户可以随后返回并稍后完成表单,方法是使每个表单保持对数据库的所有内容.

    例如


    第1步 - 创建帐户

    我希望用户在此步骤创建其身份验证详细信息,在此处创建用户帐户(带密码)并将用户登录,重定向到仪表板.在那里,我可以检查用户是否有个人资料,如果没有,请将他们重定向到个人资料创建表单.

    第2步 - 配置文件创建

    由于我们有经过身份验证的用户,因此配置文件创建表单可以将其数据保存到当前登录的用户.后续部分遵循相同的过程,但检查上一步的存在.


    您的问题似乎是确认用户是否希望创建帐户.在您创建用于确认用户帐户的表单上,我会做的是,我会将用户数据保存在隐藏的输入字段中.

    Email: {{ $input['email'] }}
    Password: {{ $input['password'] }}
    
    <form action="{{ URL::route('account-create-confirm-post') }}" method="post">
        <input type="hidden" name="email" value="{{ $input['email'] }}">
        <input type="hidden" name="password" value="{{ $input['password'] }}">
        {{ Form::token() }}
        <a href="{{ URL::previous() }}">return</a> 
        <input type="submit" name="submit_forward" value="Submit">
    </form>
    

    虽然当你要求他们在上一页确认他们的密码时,在这个页面上显示用户选择的密码似乎有点多余,而且有些用户可能会质疑为什么他们的密码在屏幕上用明文显示,特别是如果他们从公共计算机访问该站点.


    我建议的第三个选项是创建用户帐户并软删除它(Laravel 4.2 Docs/Laravel 5 Docs),将用户帐号返回到新表单:

    Email: {{ $input['email'] }}
    Password: {{ $input['password'] }}
    
    <form action="{{ URL::route('account-create-confirm-post') }}" method="post">
        <input type="hidden" name="id" value="{{ $user_id }}">
        {{ Form::token() }}
        <a href="{{ URL::previous() }}">return</a> 
        <input type="submit" name="submit_forward" value="Submit">
    </form>
    

    然后在用户确认其帐户时撤消软删除.这还有额外的好处,您可以跟踪尝试多次注册帐户并且未完成该过程并查看您的UX是否存在问题的人.


    结论

    当然,你也可以按照你一直以来的方式来做这件事,我在这里尝试做的就是向你展示一些你可以接近它的方法,就像做最好的做事方式一样,这个是一个高度自以为是的主题,可能会对如何做到这一点提出许多反对意见.最好的方法是最适合您和您的用户的方式...主要是您的用户.

    2023-01-18 13:18 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有