摘要:先從開始參照規定設定接口方法分別為,當然也是規范了以上標準請求。查看存儲是否符合預期。包括測試對路由創建后是否為的實現。具體可查看致謝上述已完成了路由的基本設計,下一章將講解從啟動到請求路由映射到服務腳本的過程。
前言
上一篇的標題改了一下,以一、二、三為章節對讀者來說是種困擾,現在的標題是依照項目進度來編寫的。上篇文章地址為 https://segmentfault.com/a/11...
這一系列文章并不準備寫太多章節,大概規劃的只有4~5章左右,具體實現代碼還請移步Github
https://github.com/CrazyCodes...
本章詳細講解一下Route(路由的實現),Come on Up Image
上圖大概說明了實現路由要經過兩個步驟
將所有路由信息存儲到超全局變量中
用戶請求時從全局變量中查找路由映射的服務腳本并實例化
OK,大概流程就是醬紫,下面開始“擼”
目錄路由的代碼暫分為以下幾個文件(這并不是確定的,詳細可查看Github)
文件名 | 注釋 |
---|---|
Route | 轉發文件:為實現 Route::get 效果 |
RouteCollection | 路由信息處理存儲 |
RouteInterface | 無需解釋 |
RouteModel | 路由模型,將每個路由信息以結構體方式存儲到$_SERVER |
Router | 路由的核心類 |
莫急,我們一個一個文件來看。先從RouteInterface開始
RouteInterface參照RESTful規定設定接口方法分別為 GET、POST、PATCH、PUT、DELETE、OPTIONS,當然Laravel也是規范了以上標準請求。
GitHub : https://github.com/CrazyCodes...
interface RouteInterface { /** * @param $uri * @param null $action * * @return mixed */ public function get($uri, $action = null); /** * @param $uri * @param null $action * * @return mixed */ public function post($uri, $action = null); /** * @param $uri * @param null $action * * @return mixed */ public function patch($uri, $action = null); /** * @param $uri * @param null $action * * @return mixed */ public function put($uri, $action = null); /** * @param $uri * @param null $action * * @return mixed */ public function delete($uri, $action = null); /** * @param $uri * @param null $action * * @return mixed */ public function options($uri, $action = null); }Router
先寫一個栗子
public function get($uri, $action = null) { return $this->addRoute("GET", $uri, $action); }
用戶調用下方代碼會指向上述方法,方法既調用addRoute方法將路由信息存儲到$_SERVER中
Route::get("/","Controller")
以下為addRoute部分的代碼
public function addRoute($methods, $uri, $action) { // 這里判斷請求方式是否合規,既是否存在 GET、POST、PATCH、PUT、DELETE、OPTIONS其中之一 if ($this->verify($methods) == false) { return false; } // 之后我們去往RouteCollection路由信息的處理類中 return $this->routes->add($uri, $this->createRoute($methods, $action)); }RouteCollection
最終達到 add 方法,將路由信息存儲到$_SERVER中
public function add($uri, RouteModel $model) { if (empty($_SERVER["routes"][$uri])) { $_SERVER["routes"][$uri] = $model; } }
第二個參數RouteModel開始我們說過這是路由模型,將每個路由以結構體的方式存儲到變量中,存儲后的結果
"routes" => array(6) { "test/get" => class ZeroRoutingRouteModel#13 (2) { public $method => string(3) "GET" public $action => string(19) "testController@test" } "test/post" => class ZeroRoutingRouteModel#14 (2) { public $method => string(4) "POST" public $action => string(19) "testController@test" } "test/put" => class ZeroRoutingRouteModel#15 (2) { public $method => string(3) "PUT" public $action => string(18) "testController@put" } "test/del" => class ZeroRoutingRouteModel#16 (2) { public $method => string(6) "DELETE" public $action => string(18) "testController@del" } "test/patch" => class ZeroRoutingRouteModel#17 (2) { public $method => string(5) "PATCH" public $action => string(20) "testController@patch" } "test/opt" => class ZeroRoutingRouteModel#18 (2) { public $method => string(7) "OPTIONS" public $action => string(18) "testController@opt" } }Route
最后通過__callStatic將代碼重定向到核心類中
public static function __callStatic($name, $arguments) { $router = new Router; return $router->{$name}($arguments[0], $arguments[1]); }
上述套路部分是Laravel的設計思想,通過這款簡單的框架可對Laravel核心設計有丁點的理解。
測試測試上次做的有點糙,從本章到系列結束,我們都以PHPunit來測試。
/** * @content tests all methods storage -> $_SERVER["routes"] */ public function testAllMethodsStorage() { $this->routes->get($methodGet = "test/get", "testController@test"); $this->assertArrayHasKey($methodGet, $_SERVER[$this->methodsDataKey]); $this->routes->post($methodPost = "test/post", "testController@test"); $this->assertArrayHasKey($methodPost, $_SERVER[$this->methodsDataKey]); $this->routes->put($methodPut = "test/put", "testController@put"); $this->assertArrayHasKey($methodPut, $_SERVER[$this->methodsDataKey]); $this->routes->delete($methodDel = "test/del", "testController@del"); $this->assertArrayHasKey($methodDel, $_SERVER[$this->methodsDataKey]); $this->routes->patch($methodPatch = "test/patch", "testController@patch"); $this->assertArrayHasKey($methodPatch, $_SERVER[$this->methodsDataKey]); $this->routes->options($methodOpt = "test/opt", "testController@opt"); $this->assertArrayHasKey($methodOpt, $_SERVER[$this->methodsDataKey]); }
上述貼出部分代碼,以過程化的方法去測試。查看存儲是否符合預期。
/** * @content RouteModel Success */ public function testCreateRoute() { $response = $this->routes->createRoute("GET", "TestController@Get"); $this->assertInstanceOf(RouteModel::class, $response); }
包括測試對路由創建后是否為RouteModel的實現。具體可查看Github
https://github.com/CrazyCodes...
上述已完成了路由的基本設計,下一章將講解從啟動到請求路由映射到服務腳本的過程。
希望本章可以幫到你,謝謝。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29805.html
摘要:前期做任何一件事情都要有個前期準備工作。作為的規定,我們命名空間得有一個祖宗名字,這里我叫他神圣的至少需要一個庫來存儲這個項目創建一個文件用于進行包管理灰常簡單,搞進來。 showImg(https://segmentfault.com/img/bVbkFcs?w=800&h=450); 前言 從本章開始,我們繼續造輪子,去完成一款類似于Laravel的現代化PHP框架,為什么說是現代...
摘要:依賴注入通過構造注入,函數調用或者屬性的設置來提供組件的依賴關系。這段代碼可以用依賴注入重構,從而解耦現在我們通過外界給予類的依賴,而不是讓它自己產生依賴的對象。根據依賴注入的概念,我們的框架實現了這些特性。 如何提高自己編寫代碼的能力呢?我們首先想到的是閱讀學習優秀的開源項目,然后寫一個自己的web框架或類庫組件。作為web開發者,我們通常都是基于面向對象OOP來開發的,所以面向對象...
摘要:每一個開發者都知道,擁有一個強大的框架可以讓開發工作變得更加快捷安全和有效。官方網站是一款老牌的框架,現在穩定版本已經是了。官方網站是由最大的社區之一的管理開發的,也是一個開源的框架。 對于Web開發者來說,PHP是一款非常強大而又受歡迎的編程語言。世界上很多頂級的網站都是基于PHP開發的。 每一個開發者都知道,擁有一個強大的框架可以讓開發工作變得更加快捷、安全和有效。在開發項目之前選...
摘要:這大概是我沒有及早使用,或多數開發者流連現狀造成的。它就是,一個的框架。行為驅動開發是來自測試驅動開發的開發過程。簡單的說,它就是經常可能一天幾次將小塊代碼整合進基礎代碼當中的行為。 showImg(https://segmentfault.com/img/remote/1460000013769815); 這是一篇社區協同翻譯的文章,已完成翻譯,更多信息請點擊?協同翻譯介紹?。 文章...
摘要:百分之百單元測試覆蓋直面一劍封喉,基于實現框架常駐,依托生態實現業務常駐,此刻未來逐步漸進。國際化例子函數隨機數字優化最開始采用的的繼承一個基礎的,方便單元測試有一定性能損失。 經過 1 個月的開發,QueryPHP v1.0.0-beta.1 版本可以發布了,這也是 beta 3 個版本的開始部分。這個版本的主要是代碼解耦和性能提升,文檔開發。 關于 QueryPHP QueryPH...
閱讀 953·2021-11-24 09:39
閱讀 2689·2021-09-26 09:55
閱讀 14155·2021-08-23 09:47
閱讀 3577·2019-08-30 15:52
閱讀 849·2019-08-29 13:49
閱讀 997·2019-08-23 18:00
閱讀 844·2019-08-23 16:42
閱讀 1635·2019-08-23 14:28