Laravel 6实现个人与企业两类用户双注册表单方案咨询
实现Laravel 6双类型用户注册(个人/企业)
我来帮你搞定这个双注册表单的需求,思路其实很清晰,咱们一步步来实现:
1. 扩展用户表结构
首先得给用户表加上区分用户类型的字段,以及企业用户专属的字段。先生成一个迁移文件:
php artisan make:migration add_user_type_fields_to_users_table
打开生成的迁移文件,修改up()方法:
public function up() { Schema::table('users', function (Blueprint $table) { $table->enum('user_type', ['personal', 'business'])->default('personal'); $table->string('company_name')->nullable(); $table->string('first_name')->nullable(); $table->string('last_name')->nullable(); }); }
执行迁移生效:
php artisan migrate
2. 更新User模型
打开app/User.php,把新增的字段加入$fillable白名单,这样才能通过批量赋值创建用户:
protected $fillable = [ 'first_name', 'last_name', 'company_name', 'email', 'password', 'user_type', ];
还可以加两个辅助方法,方便后续快速判断用户类型:
public function isPersonal() { return $this->user_type === 'personal'; } public function isBusiness() { return $this->user_type === 'business'; }
3. 添加独立注册路由
打开routes/web.php,在默认Auth路由(如果还没生成Auth,先执行composer require laravel/ui:^1.0和php artisan ui vue --auth)下面添加两个独立的注册路由:
// 个人用户注册页面 Route::get('/register/personal', 'Auth\RegisterController@showPersonalRegistrationForm')->name('register.personal'); // 个人用户注册提交 Route::post('/register/personal', 'Auth\RegisterController@registerPersonal'); // 企业用户注册页面 Route::get('/register/business', 'Auth\RegisterController@showBusinessRegistrationForm')->name('register.business'); // 企业用户注册提交 Route::post('/register/business', 'Auth\RegisterController@registerBusiness');
4. 创建两个注册视图
在resources/views/auth/register目录下新建两个视图文件:
个人用户注册视图(personal.blade.php)
@extends('layouts.app') @section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="card"> <div class="card-header">{{ __('个人用户注册') }}</div> <div class="card-body"> <form method="POST" action="{{ route('register.personal') }}"> @csrf <div class="form-group row"> <label for="first_name" class="col-md-4 col-form-label text-md-right">{{ __('名') }}</label> <div class="col-md-6"> <input id="first_name" type="text" class="form-control @error('first_name') is-invalid @enderror" name="first_name" value="{{ old('first_name') }}" required autocomplete="first_name" autofocus> @error('first_name') <span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span> @enderror </div> </div> <div class="form-group row"> <label for="last_name" class="col-md-4 col-form-label text-md-right">{{ __('姓') }}</label> <div class="col-md-6"> <input id="last_name" type="text" class="form-control @error('last_name') is-invalid @enderror" name="last_name" value="{{ old('last_name') }}" required autocomplete="last_name"> @error('last_name') <span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span> @enderror </div> </div> <div class="form-group row"> <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('邮箱') }}</label> <div class="col-md-6"> <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email"> @error('email') <span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span> @enderror </div> </div> <div class="form-group row"> <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('密码') }}</label> <div class="col-md-6"> <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password"> @error('password') <span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span> @enderror </div> </div> <div class="form-group row"> <label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('确认密码') }}</label> <div class="col-md-6"> <input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password"> </div> </div> <div class="form-group row mb-0"> <div class="col-md-6 offset-md-4"> <button type="submit" class="btn btn-primary">{{ __('注册') }}</button> </div> </div> </form> </div> </div> </div> </div> </div> @endsection
企业用户注册视图(business.blade.php)
@extends('layouts.app') @section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="card"> <div class="card-header">{{ __('企业用户注册') }}</div> <div class="card-body"> <form method="POST" action="{{ route('register.business') }}"> @csrf <div class="form-group row"> <label for="company_name" class="col-md-4 col-form-label text-md-right">{{ __('企业名称') }}</label> <div class="col-md-6"> <input id="company_name" type="text" class="form-control @error('company_name') is-invalid @enderror" name="company_name" value="{{ old('company_name') }}" required autocomplete="company_name" autofocus> @error('company_name') <span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span> @enderror </div> </div> <div class="form-group row"> <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('邮箱') }}</label> <div class="col-md-6"> <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email"> @error('email') <span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span> @enderror </div> </div> <div class="form-group row"> <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('密码') }}</label> <div class="col-md-6"> <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password"> @error('password') <span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span> @enderror </div> </div> <div class="form-group row"> <label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('确认密码') }}</label> <div class="col-md-6"> <input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password"> </div> </div> <div class="form-group row mb-0"> <div class="col-md-6 offset-md-4"> <button type="submit" class="btn btn-primary">{{ __('注册') }}</button> </div> </div> </form> </div> </div> </div> </div> </div> @endsection
5. 更新Register控制器
打开app/Http/Controllers/Auth/RegisterController.php,添加以下方法:
先导入必要的类:
use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash;
然后添加显示表单的方法:
public function showPersonalRegistrationForm() { return view('auth.register.personal'); } public function showBusinessRegistrationForm() { return view('auth.register.business'); }
最后添加处理注册提交的方法:
public function registerPersonal(Request $request) { // 验证个人用户字段 $request->validate([ 'first_name' => 'required|string|max:255', 'last_name' => 'required|string|max:255', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:8|confirmed', ]); // 创建个人用户 $user = \App\User::create([ 'first_name' => $request->first_name, 'last_name' => $request->last_name, 'email' => $request->email, 'password' => Hash::make($request->password), 'user_type' => 'personal', ]); // 自动登录用户 auth()->login($user); // 跳转到首页(可自定义跳转地址) return redirect()->route('home'); } public function registerBusiness(Request $request) { // 验证企业用户字段 $request->validate([ 'company_name' => 'required|string|max:255', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:8|confirmed', ]); // 创建企业用户 $user = \App\User::create([ 'company_name' => $request->company_name, 'email' => $request->email, 'password' => Hash::make($request->password), 'user_type' => 'business', ]); // 自动登录用户 auth()->login($user); // 跳转到首页(可自定义跳转地址) return redirect()->route('home'); }
6. 可选:添加注册入口链接
在登录页面或者导航栏加上两个注册选项的入口,比如在resources/views/auth/login.blade.php的登录按钮下方添加:
<div class="mt-2"> <a href="{{ route('register.personal') }}">个人用户注册</a> | <a href="{{ route('register.business') }}">企业用户注册</a> </div>
这样就完成了两个独立的注册表单,分别处理个人和企业用户的注册需求,测试一下就能看到效果啦。
内容的提问来源于stack exchange,提问作者ItsCharlie4real
相关产品推荐
相关产品推荐

