Laravel 5.3 使用者驗證原始碼探究 (一) 路由與註冊
簡介
Laravel 從 5.2 開始就有了開箱即用的使用者驗證,5.3 又在 5.2 的基礎上又有了一些改變。為了深入瞭解具體的使用者驗證實現,只能深入 Laravel 的原始碼,探究使用者驗證是怎麼處理的。
開始
安裝好 Laravel 5.3 的框架後,執行下面的命令
php artisan make:auth
該命令會在專案裡新增以下檔案(目錄)
app/Http/Controller/HomeController.php
resources/views/auth/
resources/views/auth/login.blade.php
resources/views/auth/passwords/
resources/views/auth/passwords/email.blade.php
resources/views/auth/passwords/reset.blade.php
resources/views/auth/register.blade.php
resources/views/home.blade.php
resources/views/layouts/
resources/views/layouts/app.blade.php
除了一個 HomeController
是處理使用者登陸之後的邏輯,其他都是一些檢視,用於顯示相應的頁面。
在 routes/web.php
裡添加了以下內容
Auth::routes();
Route::get(‘/home’, ‘[email protected]’);
Auth::routes()
是登陸、註冊需要的一些路由;下面是定義一個 /home
路由,交給 [email protected]
處理。
那麼,就從路由開始我們的探究之旅吧。
路由
我們首先看看 Auth::routes()
,定義在 vendor/laravel/framework/src/Illuminate/Support/Facades/Auth.php
public static function routes()
{
static::$app->make('router')->auth();
}
這裡由 IoC 容器 解析了一個 Illuminate\Routing\Router 類的例項,再呼叫裡面的 auth()
方法。
我們再來看看 auth() 方法,定義在 vendor/laravel/framework/src/Illuminate/Routing/Router.php
:
public function auth()
{
// Authentication Routes...
$this->get('login', 'Auth\[email protected]')->name('login');
$this->post('login', 'Auth\[email protected]');
$this->post('logout', 'Auth\[email protected]');
// Registration Routes...
$this->get('register', 'Auth\[email protected]');
$this->post('register', 'Auth\[email protected]');
// Password Reset Routes...
$this->get('password/reset', 'Auth\[email protected]');
$this->post('password/email', 'Auth\[email protected]');
$this->get('password/reset/{token}', 'Auth\[email protected]');
$this->post('password/reset', 'Auth\[email protected]');
}
這裡定義了 登陸 、 登出 、註冊 和 密碼重置 的路由。
先看看註冊部分。
註冊
App\Http\Controllers\Auth\RegisterController
負責註冊的邏輯,這裡 use 了 Illuminate\Foundation\Auth\RegistersUsers
這個 trait ,包含註冊時通用的一些邏輯。
路由 get('/register')
所繫結的方法 Auth\[email protected]
就定義在這個 trait 裡:
public function showRegistrationForm()
{
return view('auth.register');
}
很簡單,返回一個 auth.register
檢視。
auth.register
檢視獲取使用者的輸入: name
,email
,password
,然後 POST 提交到 ‘/register’。
再來看看路由 post('/register')
所繫結的方法 Auth\[email protected]
。
同樣, register
方法定義在 Illuminate\Foundation\Auth\RegistersUsers
裡:
public function register(Request $request)
{
$this->validator($request->all())->validate();
$this->guard()->login($this->create($request->all()));
return redirect($this->redirectPath());
}
首先使用請求傳入的表單呼叫 validator()
,返回一個驗證物件,再呼叫 validate()
驗證表單內容的合法性。
validator()
定義在 App\Http\Controllers\Auth\RegisterController
裡:
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',
]);
}
在這裡給出了輸入表單的驗證規則,如果我們的使用者註冊需要的表單與這幾個欄位不一致(例如需要新增一個手機號),就在這裡修改。
返回的 Validator
物件會在 register()
方法裡驗證。
再回到 register()
方法, 往下走 $this->guard()->login($this->create($request->all()));
。
$this->guard()
這裡會呼叫 Illuminate\Foundation\Auth\RegistersUsers
裡的 guard()
:
protected function guard()
{
return Auth::guard();
}
這裡無引數呼叫 Auth::guard()
返回一個預設的 guard ,看一下 config/auth.php
:
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
],
預設的 guard 是 web ; web 這個 guard 採用 session 驅動, 資料提供者是 users ;users 資料提供者使用 eloquent 驅動, 使用 App\User::class
模型。
具體這個 guard 是怎麼生成的,這裡暫時先不探究,放到登陸驗證裡再詳細說明。
接下來呼叫 guard 的 login($this->create($request->all()))
。
首先是 $this->create()
,這個方法定義在 App\Http\Controllers\Auth\RegisterController
裡:
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
}
使用 User
模型對輸入的內容新增一條記錄,並返回這個模型的物件。
同樣,如果需要修改註冊時使用的欄位,也是改寫這個方法。
生成的 User
物件交給 guard 的 login()
方法,做一系列登入的操作,具體怎麼做的,還是放到登陸驗證裡再詳細說明。
最後, return redirect($this->redirectPath());
完成了註冊、登陸的操作,最後跳轉到我們在 App\Http\Controllers\Auth\RegisterController
裡設定的 protected $redirectTo = '/home';
目標 URI。
可以看一下 $this->redirectPath()
方法怎麼寫的,在 Illuminate\Foundation\Auth\RedirectsUsers
這個 trait 裡:
public function redirectPath()
{
return property_exists($this, 'redirectTo') ? $this->redirectTo : '/home';
}
如果定義了 $redirectTo 這個屬性,就按照這個屬性返回;如果沒有,返回 ‘/home’。
這裡把這個方法寫成 trait 是因為這個方法還會在
App\Http\Controllers\Auth\LoginController
登陸控制器裡使用,所以就把redirectPath()
這個方法提出來做成一個 trait ,嚴格遵守 DRY 原則。
到這裡,就完成了註冊的所有過程。
相關推薦
Laravel 5.3 使用者驗證原始碼探究 (一) 路由與註冊
簡介 Laravel 從 5.2 開始就有了開箱即用的使用者驗證,5.3 又在 5.2 的基礎上又有了一些改變。為了深入瞭解具體的使用者驗證實現,只能深入 Laravel 的原始碼,探究使用者驗證是怎麼處理的。 開始 安裝好 Laravel 5.3 的
OkHttp3的原始碼探究(一)okHttp的使用場景
版權宣告:本文為博主原創文章,轉載請註明出處。 一、前言 對於開發者來說優秀的原始碼是最好的學習資源。通過閱讀優質原始碼就相當於和大牛有一次對話。 OkHttp是支援HTTP和HTTP/2的網路請求框架。自從Android4.4開始,Google已經開始將原始碼中的HttpURLConnecti
GCC原始碼分析(一)——介紹與安裝
原文連結:http://blog.csdn.net/sonicling/article/details/6702031 上半年一直在做有關GCC和LD的專案,到現在還沒做完。最近幾天程式設計的那臺電腦壞了,所以趁此間隙寫一點相關的分析和
Redis原始碼剖析(一)伺服器與客戶端互動流程
Redis中的C/S模型 Redis底層還是基於網路請求的,對於單機資料庫而言,網路請求僅僅是在一臺機器上互動,即伺服器客戶端都在一臺計算機上 當在終端輸入redis-serve時,便啟動了一個Redis伺服器,隨後開始初始化內部資料,對於Redis而言包括
Laravel 5.3+ 如何定義API路徑(取消CSRF保護)
從Laravel 5.3+開始,API路徑被放入了routes/api.php中。我們絕大多數的路徑其實都會在web.php中定義,因為在web.php中定義的路徑預設有CSRF保護,而API路徑預設沒有CSRF保護。在Laravel官網文件中寫到: Any HTML forms poi
zigbee 之ZStack-2.5.1a原始碼分析(一)
先看main, 在檔案Zmain.c裡面 main osal_init_system(); osalInitTasks(); ... ... SampleApp_Init( taskID ); // 使用者定義的任務
laravel框架原始碼分析(一)自動載入
一、前言 使用php已有好幾年,laravel的使用也是有好長時間,但是一直對於框架原始碼的理解不深,原因很多,歸根到底還是php基礎不紮實,所以原始碼看起來也比較吃力。最近有時間,所以開啟第5、6遍的框架原始碼探索之旅,前面幾次都是看了一些就放棄,希望這次能夠看完。每一次看原始碼都會有新的收穫,因為框
Android進階3:Activity原始碼分析(2) —— Activity啟動和銷燬流程(8.0)
上篇文章講述了app從啟動建立Activity呼叫onCreate,onStart, onResume方法,這篇文章講述一下Activity啟動的另一個切入點:startActivity方法,啟動Activity。 通過上一篇文章,我們總結一下: 1:A
Spark2.3.2原始碼解析: 6. SparkContext原始碼分析(一) : SparkEnv
SparkContext 是通往 Spark 叢集的唯一入口,可以用來在 Spark 叢集中建立 RDDs 、 累加器( Accumulators )和廣播變數( Broadcast Variables ) 。 SparkContext 也是整個 Spark 應用程式(
OKHttp 3.10原始碼解析(一):執行緒池和任務佇列
OKhttp是Android端最火熱的網路請求框架之一,它以高效的優點贏得了廣大開發者的喜愛,下面是OKhttp的主要特點: 1.支援HTTPS/HTTP2/WebSocket 2.內部維護執行緒池佇列,提高併發訪問的效率 3.內部維護連線池,支援多路複用,減少連線建立開銷 4.
DWebImage4.0原始碼探究(一
目錄 一、SDWebImage UML分析 二、SDWebImage 中 @autoreleasepool 的應用 三、SDWebImage 支援 GIF動圖 嗎? 四、SDWebImage 如何 區分圖片格式? 五、SDWebImage 快取圖片的名稱如何 避免重
runtime原始碼探究(五)category的載入
main函式開始之前,在一些準備工作之後,libSystem會呼叫 void _objc_init(void) 函式,這裡便是runtime的入口,也就是這時候啟動了runtime。蘋果自己的註釋也描述的很清楚 /**************
新手解讀:laravel 框架原始碼分析(一)
眾所周知,php的框架數不勝數,近幾年,一個以優雅著稱的框架,漸漸被國內phper所知道,並且開始使用,但是larave有一個很明顯的缺點就是,他的文件內容少的可憐。而且國內的社群也不是很活躍。所以對使用這款框架的新書造成了很大困難。 作者作為一個入門也沒多久的新手,
計算機網路探究(一)網路5層協議概述
我們每天使用網際網路,你是否想過,它是如何實現的? 全世界幾十億臺電腦,連線在一起,兩兩通訊。上海的某一塊網絡卡送出訊號,洛杉磯的另一塊網絡卡居然就收到了,兩者實際上根本不知道對方的物理位置,你不覺得這是很神奇的事情嗎? 網際網路的核心是一系列協議,總稱為"網際網
OkHttp 3.7原始碼分析(一)——整體架構
OkHttp是一個處理網路請求的開源專案,是Android端最火熱的輕量級框架,由移動支付Square公司貢獻用於替代HttpUrlConnection和Apache HttpClient。隨著OkHttp的不斷成熟,越來越多的Android開發者使用OkHtt
深度 Mybatis 3 原始碼分析(一)SqlSessionFactoryBuilder原始碼分析
MyBatis消除了幾乎所有的JDBC程式碼和引數的手工設定以及對結果集的檢索封裝。MyBatis可以使用簡單的XML或註解用於配置和原始對映,將介面和Java的POJO(Plain Old Java Objects,普通的Java物件)對映成資料庫中的記錄。 Mybatis環境快速入門 Maven依賴資
ArcGIS API for JavaScript3.x 學習筆記[3] 加載底圖(一)【天地圖(經緯度版)】
矢量地圖 說明 tiled spa 過程 相同 服務器列表 text 服務 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5
AVFoundation 框架初探究(一)
device 延時 dede 指定 來電 reat 基本 oops iop 夜深時動筆 前面一篇文章寫了視頻播放的幾種基本的方式,算是給這個系列開了一個頭,這裏面最想說和探究的就是AVFoundation框架,很想把這個框架不敢說是完全理解,但
Python 2 和 Python 3 主要區別有哪些(一)
哲學 因此 cti print語句 程序調試 ssi print 很多 efault Guido(Python之父,仁慈的獨裁者)在設計 Python3 的過程中,受一篇文章 “Python warts” 的影響,決定不向後兼容,否則無法修復大多數缺陷。---摘錄自《流暢的
Zabbix 3.4之 安裝篇(一)
systemctl 防火墻 sql數據庫 x86_64 mage system 啟動 輸入密碼 shang 實驗環境:Centos 7```1.下載zabbix yum 文件[root@xiaopeng /]# cd /etc/yum.repos.d/[root@x