摘要:在這個后面執行用戶自定義的,這些是在定義回調函數的時候一起給定當前需要調用的列表。而傳統的以正則表達式做映射方式,查找回調函數時間不穩定,最壞情況需要執行一遍所有的正則表達式。
之前使用dispatch, 但是從4.0到現在的8.0 API變動比較大,特別是在最近兩次大的版本的升級,為了保持代碼簡潔丟失了向下兼容的特性。
感覺作者的的核心思想不是很堅定。所以生出了自己造輪子的沖動。
router.lua這個是一個微型的可以在openresty里面運行的路由控制器,曾經幫作者做了一次重大改版,現在還是這個項目第二貢獻者。
其中的思想是很值得借鑒的:
使用樹形結構來保存url和handler的映射關系。(按照樹形結構查找保證了查找回調函數的效率Olog(n),而傳統的以正則表達式做key映射handler方式,查找回調函數時間不穩定,最壞情況需要執行一遍所有的正則表達式)
將reqest method定義成是match函數的一個封裝形式。便于提供方便的形式來映射路由。
Router鑒于以上兩個非常好的特性,所以就把這個lua的庫在PHP下面重寫了一遍。同時在寫的過程中加入了一些新的特性:
增加error這個API,一個API提供兩種調用方式(這個借鑒了dispatch里面的一些特性,有點像jquery的某些方法),可以兼具定義error handler和觸發error handler的作用。
增加hook API,同樣有兩種調用方式。
默認觸發“before”和“after”兩個hook。分別在執行真正的handler前后。
在“before”這個hook后面執行用戶自定義的hook,這些hook是在定義回調函數的時候一起給定當前url需要調用的hook列表。(當然這些hook全部都要用戶自己定義回調函數)
安裝這個微型的路由控制器已經提交到packagist網站,可以通過composer工具安裝
composer require lloydzhou/router此處附README里面的一個例子:
(new Router()) /* 定義錯誤處理函數 */ ->error(401, function($message){ header("Location: /login", true, 302); die($message); }) ->error(405, function($message){ header("Location: /hello/world", true, 302); }) ->error(406, function($message){ die($message); }) /* 定義hook函數,除了內置默認調用的before和after,還定義了檢查登錄的auth */ ->hook("auth", function($params){ if ("lloyd" == $params["name"]) return $params; $params["router"]->error(401, "Forbiden"); }) /* 定義after這個鉤子函數,支持json或者jsonp格式輸出 */ ->hook("after", function($result, $router){ if ($result) { header("Content-type: application/". ($_GET["jsoncallback"]?"javascript":"json")); if ($_GET["jsoncallback"]) print $_GET["jsoncallback"]. "(". json_encode($result). ")"; else print json_encode($result); } }) ->hook("before", function($params){ //$params["name"] = "lloydzhou"; return $params; }) /* 定義url映射 */ ->get("/", function(){ echo "Hello world !!!"; }) ->get("/hello/:name", function($name){ echo "Hello $name !!!"; }) ->get("/hello/:name/again", function($name){ echo "Hello $name again !!!"; }, "auth") ->get("/hello/:name.:ext", function($name, $ext){ if ("js" == $ext || "json" == $ext) return array("name"=>$name); return array("code"=>1, "msg"=>"error message..."); }, "auth") /* 程序入口,以當前的url查找對應的處理函數,并獲取變量執行該函數 */ ->execute();啟動服務
php -S 0.0.0.0:8888 test.php測試
curl -vvv 127.0.0.1:8888/hello/ url未能映射成功,觸發405錯誤處理函數, 自動跳轉向 URL: "/hello/world" curl -vvv 127.0.0.1:8888/hello/lloyd 返回 "Hello lloyd !!!" curl -vvv 127.0.0.1:8888/hello/lloyd/again 返回 "Hello lloyd again !!!" curl -vvv 127.0.0.1:8888/hello/world/again 在鉤子函數auth處理失敗觸發401錯誤處理函數, 自動跳轉到 URL: "/login" curl -vvv 127.0.0.1:8888/hello/lloyd.json 支持“/”和“.”作為pathinfo的分隔符,并且和after鉤子函數配合,返回json格式文本 {"name": "lloyd"} curl -vvv 127.0.0.1:8888/hello/lloyd.js?jsoncallback=test 返回jsonp格式文本 test({"name": "lloyd"}) curl -vvv 127.0.0.1:8888/hello/lloyd.jsx?jsoncallback=test 最后的后綴名不匹配,輸出錯誤jsonp格式的消息 test({"code":1,"msg":"error message..."})編譯
開發環境使用CRouter替代Router可以自動檢測文件修改時間,并且編譯成原生數組保存至router.inc.php
(new CRouter("router.inc.php", true))
發布的時候只需要把路由映射的部分替換成以下兩行代碼即可跳過創建路由映射表的階段。以節省時間!!!
$router = include("router.inc.php"); $router->execute();性能
使用樹形結構來保存url和handler的映射關系。查找URL映射函數的時候保證了查找回調函數的效率O(log n)。
而傳統的以正則表達式做key映射handler方式,查找回調函數時間不穩定,最壞情況需要執行一遍所有的正則表達式。
支持編譯,將映射好的樹形路由映射數組直接編譯成源碼。不需要每次PHP請求的時候重新切割pathinfo再來生成樹形節點。以節省時間!
DEMO為了一邊測試,一邊完善這個庫。所以使用這個庫結合另外一個ActiveRecord和MicroTpl 寫了一個簡單的博客,里面基本涵蓋了這幾個庫的API。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/21150.html
摘要:每一個開發者都知道,擁有一個強大的框架可以讓開發工作變得更加快捷安全和有效。官方網站是一款老牌的框架,現在穩定版本已經是了。官方網站是由最大的社區之一的管理開發的,也是一個開源的框架。 對于Web開發者來說,PHP是一款非常強大而又受歡迎的編程語言。世界上很多頂級的網站都是基于PHP開發的。 每一個開發者都知道,擁有一個強大的框架可以讓開發工作變得更加快捷、安全和有效。在開發項目之前選...
摘要:所以,是幫助您創建您的項目的測試框架,單元測試。行為驅動開發是一個來自測試驅動開發的開發過程。這種語言被稱為,是用來描述被測試的預期的行為。代碼將被測試并且沒有異常。這些標準提出了現代編碼風格。 本文來自medium----原文鏈接; 歡迎作客我們的php&Laravel學習群:109256050 你需要開始使用測試 這是我每天對自己說的話。像很多人一樣,我不會像TDD所建議的那樣測試...
摘要:新聞焦點英特爾凌動處理器產品家族是首款基于微架構的處理器,擁有種可定制化配置,面向微型服務器入門級網絡和冷數據存儲。全球領先的托管服務公司與已經對英特爾凌動片上系統進行了測試,并計劃于下一季度在其入門級專用托管服務中部署該產品。 新聞焦點 · 英特爾凌動 C2000 處理器產品家族是首款基于 Silvermont 微架構的處理器,擁有13 種可定制化配置,面向微型服務器、入門級網絡...
閱讀 3014·2020-01-08 12:17
閱讀 1999·2019-08-30 15:54
閱讀 1156·2019-08-30 15:52
閱讀 2040·2019-08-29 17:18
閱讀 1051·2019-08-29 15:34
閱讀 2466·2019-08-27 10:58
閱讀 1867·2019-08-26 12:24
閱讀 374·2019-08-23 18:23