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,使多页注册并将输入数据保存到会话的主要内容,如果未能解决你的问题,请参考以下文章
减少对外部 API 的身份验证调用(Laravel 5.6)