我试图在laravel中创建两种类型的用户,并且我有两个表。我想从laravel使用定义的寄存器视图和控制器,但是当我注册新用户时,它只保存在第一个表中。
问题在于此url('/register')
来自<form class="form-horizontal" role="form" method="POST" action="{{ url('/register') }}" id="form_reg1">
,我不知道如何编辑此网址以发送帖子请求,因为我使用了两个表单,一个用于第一类用户,第一类用户。
这是第一个控制器:
<?php
namespace App\Http\Controllers\Auth;
use App\User;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\RegistersUsers;
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 login / registration.
*
* @var string
*/
protected $redirectTo = '/index';
/**
* 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|max:255',
'email' => 'required|email|max:255|unique:users',
'password' => 'required|min:6|confirmed',
'first_name' => 'required|max:255',
'last_name' => 'required|max:255',
]);
}
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return User
*/
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
'first_name' => $data['first_name'],
'last_name' => $data['last_name'],
]);
}
}
这是第二个控制器:
<?php
namespace App\Http\Controllers\Auth;
use App\Merchant;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\RegistersUsers;
class RegisterMerchantController 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 login / registration.
*
* @var string
*/
protected $redirectTo = '/index';
/**
* 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|max:255',
'email' => 'required|email|max:255|unique:users',
'password' => 'required|min:6|confirmed',
'first_name' => 'required|max:255',
'last_name' => 'required|max:255',
]);
}
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return User
*/
protected function create(array $data)
{
return Merchant::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
'first_name' => $data['first_name'],
'last_name' => $data['last_name'],
]);
}
}
所以任何想法?
答案 0 :(得分:1)
如果将用户保存到同一个表中并使用它会更好 polymorphic relationships 可以区分它们。这种技术 还可以帮助您验证用户身份,因为您可以对用户进行身份验证 通过引用单个表(
users
)。
所以你的表结构会是这样的:
- users
- id
- owner_id
- owner_type
- email
- password
- token
- ...
- clients
- id
- name
- gender
- mobile
- ...
- merchants
- id
- name
- gender
- mobile
- ...
您的模型 - Client
,User
&amp; Merchant
看起来像这样:
class User extends Model
{
public function owner()
{
return $this->morphTo();
}
}
class Client extends Model
{
public function user()
{
return $this->morphOne(User::class, 'owner');
}
}
class Merchant extends Model
{
public function user()
{
return $this->morphOne(User::class, 'owner');
}
}
现在在HTML表单中,您可以添加select
选项以选择要创建的用户类型(或者您可以借助hidden fields
来实现它),我正在使用用于演示目的的选择选项:
<form action="{{ route('register_route_name') }}" method="POST">
{{ csrf_field() }}
<select name="type">
<option disabled> Select Type of User </option>
<option value="1"> Client </option>
<option value="2"> Merchant </option>
</select>
<input type="text" name="name">
<input type="text" name="mobile">
<input type="radio" name="gender" value="0"> Male
<input type="radio" name="gender" value="1"> Female
<input type="email" name="email">
<input type="password" name="password">
<input type="submit" value="Register">
</form>
现在在您的控制器中,您将根据您从中获取的类型添加用户:
class RegisterController extends Controller
{
public function register()
{
// You should use validator here to validate your inputs here...
$inputs = request()->except('_token');
if($inputs['type'] == 1) {
$profile = Client::create(array_only($inputs, ['mobile, 'gender', 'name']));
} else {
$profile = Merchant::create(array_only($inputs, ['mobile, 'gender', 'name']));
}
$user_inputs_arr = array_only($inputs, ['email', 'password']);
$user_inputs_arr['password'] = bcrypt($inputs['password']);
$user = $profile->user()->create($user_inputs_arr);
// Hence your client is registered successfully...
}
}
希望这有帮助!