1. 程式人生 > >Laravel 5.3 使用者驗證原始碼探究 (一) 路由與註冊

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 檢視獲取使用者的輸入: nameemailpassword,然後 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,
        ],
    ],

預設的 guardwebweb 這個 guard 採用 session 驅動, 資料提供者是 usersusers 資料提供者使用 eloquent 驅動, 使用 App\User::class 模型。

具體這個 guard 是怎麼生成的,這裡暫時先不探究,放到登陸驗證裡再詳細說明。

接下來呼叫 guardlogin($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 物件交給 guardlogin() 方法,做一系列登入的操作,具體怎麼做的,還是放到登陸驗證裡再詳細說明。

最後, 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