1. 程式人生 > >2016 版 Laravel 系列入門教程(二)【最適合中國人的 Laravel 教程】

2016 版 Laravel 系列入門教程(二)【最適合中國人的 Laravel 教程】

本篇文章中,我將跟寶寶們一起學習 Laravel 框架最重要的部分——路由系統。

如果你讀過舊的基於 Laravel 5.0 版本的此教程,你會發現那篇文章裡大書特書的 Auth 系統構建已經被 Laravel 捎帶手給解決了。在更早的 Laravel 4 版本的教程中,實際上我是通過讓大家自己動手構建高難度的 Auth 系統來提高短期學習曲線的斜率,以便寶寶們能更快地感受到 Laravel 執行的原理。但是很遺憾,現在的 Auth 系統實在是太強大了,執行幾句命令就激活了這個功能,新手其實還是雲裡霧裡。為了彌補這個缺憾,本寶寶決定赤膊上陣,手刃路由系統,直接給大家展示 Laravel 是如何組織 MVC 架構,來控制網站執行的。

初識路由

路由系統是所有 PHP 框架的核心,路由承載的是 URL 到程式碼片段的對映,不同的框架所附帶的路由系統是這個框架本質最真實的寫照,一絲不掛,一覽無餘。Laravel 路由中文文件: http://laravel-china.org/docs/5.1/routing

Laravel 5 之後就把路由放到了 learnlaravel5/app/Http/routes.php 這個位置,我們先看一下目前路由中僅存的幾行程式碼:

Route::get('/', function () {
    return view('welcome');
});

Route::auth();

Route::get('/home', '
[email protected]
');

中間的一行程式碼 Route::auth(); 就是 Auth 系統自動注入的路由配置,我們不用深究,我們的注意力主要集中頭三行和最後一行程式碼上。

名稱空間

本寶寶一直認為 Laravel 5 除了效能大幅提升之外相對於 4 最大的進步就在於新的名稱空間規劃:更清晰,更合理,更有利於新手。

Laravel 4 失敗的簡潔

Laravel 4 時代,大量的程式碼都執行在根名稱空間下,路由、Controller、Model 等等。看起來這麼做可以少寫幾行枯燥的 use xxxx; ,實則是對於名稱空間的誤使用,而且對於新手學習名稱空間是有毒的。

絕對類名

Laravel 5 全面引入了 psr-4 名稱空間標準:名稱空間和實際檔案所在的資料夾層級一致,資料夾首字母大寫即為此檔案的約定名稱空間。舉個小栗子:learnlaravel5/app/Http/Controllers/HomeController.php 的絕對類名為:\App\Http\Controllers\HomeController , learnlaravel5/app/User.php的絕對類名為: \App\User 。

“絕對類名”是本寶寶自創的:在啟用了名稱空間的系統中,子名稱空間下的類有一個全域性都可以直接訪問的名稱,這個名稱就是該類的名稱空間全稱。雖然名稱空間在“實用主義”的 PHP 語言裡看起來十分古怪,不過他也還是 PHP 嘛,依然遵循 PHP 的執行原理和哲學。同理,Laravel 無論多麼強大,他都是 PHP 程式碼寫成的,所以當你苦於 Laravel 沒有提供某個你需要的功能時,不要驚慌不要著急,just write the code in the PHP way。

好用的資料

名稱空間其實沒什麼特別難的地方,我曾經寫過一篇文章專門扒光名稱空間的祕密:

《PHP 名稱空間 解惑》

基礎路由解析

閉包路由

路由檔案中前三行即為閉包路由:

Route::get('/', function () {
    return view('welcome');
});

閉包路由使用閉包作為此條請求的響應程式碼,方便靈活,很多簡單操作直接在閉包裡解決即可。例如“輸出伺服器當前時間”:

Route::get('now', function () {
    return date("Y-m-d H:i:s");
});

如果你想得到北京時間,請在 learnlaravel5/config/app.php 第 55 行左右把 timezone 設定為上海:

'timezone' => 'Asia/Shanghai',


控制器@方法 路由

閉包路由雖然靈活強大,不過大多數場景下我們還是需要回歸到 MVC 架構的:

Route::get('/home', '[email protected]');

這行路由程式碼的意思想必大家都能猜到一二了:當以 GET 方法訪問http://fuck.io:1024/home 的時候,呼叫 HomeController 控制器中的 index 方法(函式)。同理,你可以使用 Route::post('/home', '[email protected]'); 響應 POST 方法的請求。

控制器@方法 呼叫原理淺析

Laravel 的路由跟所有 PHP 框架的路由一樣,都是用的最簡單直接的 PHP 方式來呼叫控制器中的方法的:使用字串初始化類得到物件,呼叫物件的指定方法,返回結果。下面我簡單羅列幾步對 Laravel 路由呼叫過程的探測,感興趣的話可以自己研究。

learnlaravel5/app/Providers/RouteServiceProvider.php

全域性搜尋 routes.php ,我們找到了這個檔案。此檔案最後的 mapWebRoutes 方法,給所有的路由同意加進了一個路由組,定義了一個名稱空間和一箇中間件:

protected function mapWebRoutes(Router $router)
{
    $router->group([
        'namespace' => $this->namespace, 'middleware' => 'web',
    ], function ($router) {
        require app_path('Http/routes.php');
    });
}

順著這個函式往上看,你會發現名稱空間定義的地方:

protected $namespace = 'App\Http\Controllers';

之後名稱空間、類、方法是如何傳遞的呢?

learnlaravel5/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php

經過簡單的追蹤,我們找到了這個檔案。讓我們在 dispatch 方法中增加一行var_dump($controller); ,重新整理就可以看到頁面上如下的輸出:


這就是我們要呼叫的控制器類的“絕對類名”。

最後一步

Laravel 使用了完整的面向物件程式架構,對控制器的呼叫進行了超多層封裝,所以最簡單地探測方式其實是手動丟擲錯誤,這樣就可以看到完整的呼叫棧:

在 HomeController 的 index 方法裡的 return 之前增加一行 throw new \Exception("我故意的", 1); ,重新整理頁面,你將看到以下畫面:


我們可以看到,是learnlaravel5/vendor/laravel/framework/src/Illuminate/Routing/Controller.php 第 80 行最終驅動起了 HomeController:

public function callAction($method, $parameters)
{
    return call_user_func_array([$this, $method], $parameters);
}
具體的細節不再詳解,寶寶如果感興趣的話,把這些方法一個一個地都看一遍吧,相信對於你理解 Laravel 執行原理很有幫助。其實 PHP 跟字串結合的緊密程度已經緊逼 js 和 JSON 了。

相關推薦

2016 Laravel 系列入門教程適合中國人Laravel 教程

本篇文章中,我將跟寶寶們一起學習 Laravel 框架最重要的部分——路由系統。 如果你讀過舊的基於 Laravel 5.0 版本的此教程,你會發現那篇文章裡大書特書的 Auth 系統構建已經被 Laravel 捎帶手給解決了。在更早的 Laravel 4 版本的教程中,

2016 Laravel 系列入門教程適合中國人Laravel 教程

在本篇文章中,我們將嘗試構建一個帶後臺的簡單部落格系統。我們將會使用到 路由、MVC、Eloquent ORM 和 blade 檢視系統。 原文地址:http://www.cnblogs.com/grimm/p/5627004.html 簡單部落格系統規劃 我們在教程一中已經新建了一個 Eloquent

Laravel 系列入門教程適合中國人Laravel 教程

在本篇文章中,我們將嘗試構建一個帶後臺的簡單部落格系統。我們將會使用到 路由、MVC、Eloquent ORM 和 blade 檢視系統。 簡單部落格系統規劃 我們在教程一中已經新建了一個繼承自 Eloquent Model 類的 Article 類,使用 migration 建立了資料表並使用 seed

Laravel 4 系列入門教程適合中國人Laravel教程

每一個教程完成,我將會git commit一次。 大家在任何地方卡住,最快捷的解決方式就是去看我的示例程式碼。 0. 預設條件 本文預設你已經有配置完善的PHP+MySQL執行環境,懂得PHP網站執行的基礎知識。跟隨本教程走完一遍,你將會得到一個基礎的包含

Laravel 5 系列入門教程適合中國人Laravel 教程完結

本文是本系列教程的完結篇,我們將一起給 Page 加入評論功能,讓遊客在前臺頁面可以檢視、提交、回覆評論,同時我們將在後臺完善評論管理功能,可以刪除、編輯評論。Page 和評論將使用 Eloquent 提供的“一對多關係”。最終,我們將得到一個個人部落格系統的雛形,並佈

DQNDeep Q-learning入門教程優選擇

在上一篇部落格:[DQN(Deep Q-learning)入門教程(一)之強化學習介紹](https://www.cnblogs.com/xiaohuiduan/p/12945449.html)中有三個很重要的函式: - 策略:$\pi(a|s) = P(A_t=a | S_t=s)$ - 狀態價值函式:

Ajax技術之XMLHttpRequestXMLHttpRequest常用方法和屬性

tro 沒有 body htm 事件 thead 指定 response date 一、XMLHttpRequest中常用的方法: (1)open()方法:用於設置進行異步請求目標的URL、請求方法以及其他參數信息。 函數原型:open("method","URL",asy

基於spring boot和mongodb打造一套完整的許可權架構MAVEN依賴以及相應配置

       在上一章我們已經新建好整個專案了,在本章我們將講解我們的這套許可權架構所需要的maven依賴以及相關的配置,大家開啟我們的pom.xml增加完maven依賴以後的配置檔案如下:<?xml version="1.0" encoding="UTF-8"?>

使用者認證使用Flask-Login認證使用者

Flask-Login擴充套件,記住認證狀態,管理使用者認證系統中的認證狀態 pip install flask-login 準備用於登入的使用者模型 flasky/app

Python入門系列教程

字符 小寫 無符號 bsp div width raw_input abc body 字符串 1.字符串輸出 name = ‘xiaoming‘ print("姓名:%s"%name) 2.字符串輸入 userName = raw_input(‘請輸

API 系列教程:結合 Laravel 5.5 和 Vue SPA 基於 jwt-auth 實現 API 認證

上一篇我們簡單演示了 Laravel 5.5 中 RESTful API 的構建、認證和測試,本教程將在上一篇教程的基礎上進行昇華。 我們將結合 Laravel 和 Vue 單頁面應用(SPA),在它們的基礎上引入 jwt-auth 實現 API 認證,由於 Laravel 集成了對 Vue

資料探勘入門系列教程之分類問題OneR演算法

資料探勘入門系列教程(二)之分類問題OneR演算法 資料探勘入門系列部落格:https://www.cnblogs.com/xiaohuiduan/category/1661541.html 專案地址:GitHub 在上一篇部落格中,我們通過分析親和性來尋找資料集中資料與資料之間的相關關係。這篇部落

Nginx實用教程:配置文件入門

affinity type 服務 源碼編譯 設置時間 shutdown ber 可用 控制指令 Nginx配置文件結構 nginx配置文件由指令(directive)組成,指令分為兩種形式,簡單指令和區塊指令。 一條簡單指令由指令名、參數和結尾的分號(;)組成,例如:

CodeArt入門教程

本質 文件夾 不同的 存在 切換數據庫 站點 ear 新的 組裝 4.第一個示例的編碼工作   使用CA編碼項目的核心結構是:由多個子系統組成多個不同的服務來提供項目的各種功能。請不要將這裏提到的子系統與大家在別的項目實施方法裏的概念混為一談,CA裏的子系統概念是完全不一樣

Dapper入門教程——執行非查詢語句

文本 resp -exec factor -h spa onf fec table 描述 你可以從任意實現IDbConnection的類對象中調用Dapper的擴展方法“Execute”。它能夠執行一條命令(Command)一次或者多次,並返回受影響的行數。這個方法通常用來

JXLS 2.4.0系列教程——循環導出一個鏈表的數據

教程 super 最簡 com arraylist port 至少 ron mod 請務必先看上一篇文章,本文在上一篇文章的代碼基礎上修改而成。 JXLS 2.4.0系列教程(一)——最簡單的模板導出 上一篇文章我們介紹了JXLS和模板導出最簡單的應用,現在我們要更進一

ThinkJS框架入門詳細教程新手入門項目

logs connect 項目 目錄 itl 合並 sql文件 生產 js框架 一、準備工作 參考前一篇:ThinkJS框架入門詳細教程(一)開發環境 安裝thinkJS命令 npm install -g think-cli 監測是否安裝成功 thin

web全棧學習教程:本系列教程介紹

系列教程 trap soft 切圖 think html4 style pes html 一、發布周期 計劃2-3天發一篇,半年左右完成。 二、教程大綱 web全棧介紹與優勢分析 本系列教程介紹 切圖與圖片介紹 html4.01 html5 css2.0 css3 頁面布

Python入門教程

ack 布爾代數 記事本 成對 .py 語法錯誤 是什麽 ech eclips   今天講編程思維。  可能這對初次接觸編程的人有用——我不是不想切入正題,我只是想強調根本沒什麽正題,我可能在其他文章裏提過這一點。“編程語言就是語法糖”,可能你不知道什麽是語法糖,但是知道的

JavaScript基礎入門教程

alert .get OS 全部 isnan rep mut 分別是 只有一個 說明   前一篇博客介紹了js以及一些關於js基本類型的簡單知識,本篇博客將詳細介紹js的基礎類型,捎帶介紹對象類型,更詳細的對象類型的說明將後續再講。 js中類型的說明   js中的類型分