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