在Laravel 5.3中注册新类型的用户

时间:2016-12-05 12:26:31

标签: laravel laravel-5 laravel-5.3

我试图在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'],
        ]);
    }
}

所以任何想法?

1 个答案:

答案 0 :(得分:1)

  

如果将用户保存到同一个表中并使用它会更好    polymorphic relationships 可以区分它们。这种技术   还可以帮助您验证用户身份,因为您可以对用户进行身份验证   通过引用单个表(users)。

所以你的表结构会是这样的:

- users
    - id
    - owner_id
    - owner_type
    - email
    - password
    - token
    - ...

- clients
    - id
    - name
    - gender
    - mobile
    - ...

- merchants
    - id
    - name
    - gender
    - mobile
    - ...

您的模型 - ClientUser&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...
    }

}

希望这有帮助!