Laravel 5.6,使多页注册并将输入数据保存到会话

Posted

技术标签:

【中文标题】Laravel 5.6,使多页注册并将输入数据保存到会话【英文标题】:Laravel 5.6, make multiple page register and save input data to session 【发布时间】:2018-10-02 14:26:36 【问题描述】:

我想有人给我一些建议。我真的被困住了。我是 laravel 的新手。我会尝试用多个页面制作注册页面。我想做这样的:

    第一页用户输入一些数据,然后点击下一步,数据将存储到会话并重定向到第二页注册 之后,用户输入一些数据,当用户点击完成时,数据将被保存到表用户。

我使用 laravel 身份验证 php artisan make:auth 并根据需要修改视图和控制器。但是当我单击下一步按钮时,什么也没有发生。

当我在控制台中查看时,它显示POST http://localhost:8000/registrasi/v2 500 (Internal Server Error)

当我签入网络标签时,它说

",…
exception
:
"Illuminate\Database\QueryException"
file
:
"C:\xampp\htdocs\vojo\vendor\laravel\framework\src\Illuminate\Database\Connection.php"
line
:
664
message
:
"SQLSTATE[42S22]: Column not found: 1054 Unknown column 'senderEmail' in 'where clause' (SQL: select count(*) as aggregate from `users` where `senderEmail` = clubband@gmail.com)"
trace
:
[file: "C:\xampp\htdocs\vojo\vendor\laravel\framework\src\Illuminate\Database\Connection.php",…,…]"

这是我的代码

Web.php

Route::get('/', function () 
return view('welcome');
);

Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
Route::group(['prefix'=>'registrasi'], function()
Route::get('/v1','Auth\RegisterController@ShowView');
Route::post('/v2','Auth\RegisterController@store');
); 

我的迁移用户表

    <?php

   use Illuminate\Support\Facades\Schema;
   use Illuminate\Database\Schema\Blueprint;
   use Illuminate\Database\Migrations\Migration;

   class CreateUsersTable extends Migration
   
   /**
    * Run the migrations.
    *
    * @return void
    */
    public function up()
    
       Schema::create('users', function (Blueprint $table) 
            $table->increments('id');
            $table->string('username')->unique();
            $table->string('password');
            $table->string('email')->unique();
            $table->string('name');
            $table->enum('user_type', ['customer', 'band', 'admin'])- 
            >default('customer');
            $table->string('profile_picture')->nullable();
            $table->datetime('last_login')->nullable();
            $table->rememberToken();
            $table->timestamps();
            );
     

     /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        Schema::dropIfExists('users');
     

RegisterController.php

<?php

namespace App\Http\Controllers\Auth;
use Illuminate\Http\Request;
use App\Models\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;
use Session;
class RegisterController extends Controller

/*
|--------------------------------------------------------------------------
| Register Controller
|--------------------------------------------------------------------------
|
| This controller handles the registration of new users as well as their
| validation and creation. By default this controller uses a trait to
| provide this functionality without requiring any additional code.
|
*/

use RegistersUsers;

/**
 * Where to redirect users after registration.
 *
 * @var string
 */
   protected $redirectTo = '/home';

/**
 * Create a new controller instance.
 *
 * @return void
 */
   public function __construct()
   
        $this->middleware('guest');
    

/**
 * Get a validator for an incoming registration request.
 *
 * @param  array  $data
 * @return \Illuminate\Contracts\Validation\Validator
 */
    protected function validator(array $data)
    
        return Validator::make($data, [
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:6|confirmed',
            ]);


     

/**
 * Create a new user instance after a valid registration.
 *
 * @param  array  $data
 * @return \App\User
 */
     protected function create(array $data)
    
         return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
             'password' => bcrypt($data['password']),
    ]);


protected function store(Request $request)
    $this->validate($request, [
        'senderName' => 'required|string|max:255',
        'senderEmail' => 'required|string|email|max:255|unique:users',
        'senderUsername' => 'required|string|max:255|unique:users',
        'senderPassword' => 'required|string|min:6'
    ]);

 Session::put('SimpanRegisterBand',$request->all());

    return view('layouts.test');

protected function ShowView()
    return view('Auth.register');


对不起,我的英语不好。谢谢。

【问题讨论】:

【参考方案1】:

对于显示的错误消息,您有一个 SQL 错误,这意味着您向不存在的表发送了一个字段“senderEmail”:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'senderEmail' in 'where clause' (SQL: select count(*) as aggregate from users where senderEmail = clubband@gmail.com)

其次,要在会话中存储数据,请使用:

Session::put('key',$value);

要从会话中获取数据,请使用:

Session::get('key')

不要忘记添加使用行,例如:

use Session;

【讨论】:

谢谢您的建议,先生。但我想先将数据存储到会话,然后将数据存储到数据库。对我的代码有什么建议我应该改变先生? 你应该有两个视图,这意味着两个动作,所以在第一个动作中存储 $request->all() 到 Session 并重定向到第二页(视图),然后你会去到第二个动作(它可以是控制器中的存储动作),您可以将传入的数据存储到会话中,获取新旧数据并将它们存储到数据库中【参考方案2】:

您需要在 store() 方法中进行适当的验证。唯一验证需要指定列名,否则只会将请求名作为列名。

这是修改后的代码。

protected function store(Request $request)
    $this->validate($request, [
        'senderName' => 'required|string|max:255',
        'senderEmail' => 'required|string|email|max:255|unique:users,email',
        'senderUsername' => 'required|string|max:255|unique:users,username',
        'senderPassword' => 'required|string|min:6'
    ]);

    Session::put('SimpanRegisterBand',$request->all());

    return view('layouts.test');

【讨论】:

以上是关于Laravel 5.6,使多页注册并将输入数据保存到会话的主要内容,如果未能解决你的问题,请参考以下文章

在多页数据表中注册所有输入

将用户输入数据保存在多页 php 表单中

Laravel 会话突然被破坏

减少对外部 API 的身份验证调用(Laravel 5.6)

在 laravel 5 中注册用户并将数据发送到两个表,这是正确的

Laravel 5.6 护照未经身份验证