php-laravel框架使用者驗證(Auth)模組解析(二)註冊模組
阿新 • • 發佈:2018-12-26
一、註冊模組路由
路由名稱 | 請求方式 | 方法實現 |
/register | GET | 註冊頁面 |
/register | POST | 實現註冊功能 |
二、控制器解析
控制器僅僅實現配置的功能,大部分的邏輯使用trait引入。因此,如果需要定製功能的話,需要重寫trait。對於簡單的網站來說,預設的功能已經足夠了。
$redirectTo配置,如果在登入狀態,重定向的頁面
protected $redirectTo = '/home';
validator方法和create方法定義了驗證和提交的欄位
/** * 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' => Hash::make($data['password']), ]); }
三、擴充套件開發:自定義註冊欄位
在實際業務中,我們可能需要更多的欄位,那麼如何擴充套件呢?
我這裡調整一下,email欄位改為非必填(如果填了需要驗證合法性和唯一性),新增加一個phone欄位非必填(如果填了需要驗證合法性和唯一性)
需要改動的地方:
1)auth/register.blade.php模板,需要增加phone欄位,並將email,phone表單中的require去掉。
2)RegisterController我們需要改動validator和create方法
/** * 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', 'min:6', 'max:64'], 'email' => ['nullable', 'string', 'email', 'max:64', 'unique:users'], 'phone' => ['nullable', 'string', 'regex:/^[0-9]{11}$/', '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'], 'phone' => $data['phone'], 'password' => Hash::make($data['password']), ]); }
完成之後,發現phone的值沒有寫入到資料庫中,我們需要修改App\User類,在$fillable配置中新增phone這個欄位
protected $fillable = [
'name', 'email', 'phone', 'password',
];
3)註冊完成後,跳轉到登入頁,不要自動登入
註冊這個行為,是Illuminate\Foundation\Auth\RegistersUsers::register方法實現的。這個是laravel實現的包,我們在開發中不應該改動包裡面的程式碼。RegistersUsers是一個trait,我們可以在RegisterController把這個方法覆蓋掉。
/**
* Handle a registration request for the application.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function register(Request $request)
{
$this->validator($request->all())->validate();
event(new Registered($user = $this->create($request->all())));
//$this->guard()->login($user);
return $this->registered($request, $user)
?: redirect($this->redirectPath());
}
可以看看我的demo:http://shebao.bytrees.com/login