摘要:歡迎感興趣的去了解和提出建議,也歡迎地址期望用法先來看看我要怎么用這個框架基本上跟類似,先一個對象,使用方法添加中間件,支持閉包或外部文件。
nodejs的koa可以說是非常受歡迎的,特別是其“洋蔥模型”應該用過的人印象都比較深,下面就嘗試用php來實現一個。
注:本文是PHPec框架的最原始思路版本。PHPec是在此基礎上完善編寫出來的一個極簡的輕量級開發框架,除了提供中間件調用模式外,同時提供了常見的自動路由功能,目前 已在github上發布了最初版本。歡迎感興趣的去了解和提出建議,也歡迎star. 地址:https://github.com/tim1020/PHPec期望用法
先來看看我要怎么用“這個框架”?
require "app.php"; $app = new App(); $app -> use(function($ctx){ $ctx -> body.= ">m1"; $ctx -> next(); $ctx -> body .= ">m1 end"; }); $app -> use("Middleware2"); $app -> run();
基本上跟koa類似,先new一個app對象,使用use方法添加中間件,支持閉包或外部文件。
$ctx支持注入所需的各種參數,方便各中間件共用。
完整代碼//app.php class App{ private $m = array(); private $ctx = array(); function next(){ $f = $this -> c -> current(); if(!$f) return; $this -> c -> next(); $f($this); } function run(){ $this -> c = $this -> _gen(); $this -> next(); } private function _gen(){ foreach($this -> m as $v){ yield $v; } } private function _add($m){ if(!empty($this->m) && $this -> m[count($this->m) -1] === false) return; if(!$m){ $this -> m[] = false; }elseif(($m instanceof Closure)){ $this -> m[] = $m; }else{ $m = $this -> _load($m); if(!function_exists($m)){ throw new Exception("middleware error"); } else $this -> m[] = $m; } } //處理文件加載,返回執行函數(如需要,可加入命名空間處理) private function _load($m){ $f = "./middleware/".$m.".php"; if(!file_exists($f)) throw new Exception("middleware error"); require $f; return $m; } function __call($m,$v){ if("use" == $m){ $p = isset($v[0]) ? $v[0] : ""; $this -> _add($p); }else{ throw new Exception("method not exists"); } } function __set($k,$v){ $this -> ctx[$k] = $v; } function __get($k){ return isset($this -> ctx[$k]) ? $this -> ctx[$k] : NULL; } }
沒錯,這就是全部的代碼。
代碼講解 use方法use可以加入閉包或外部文件,且php5不支持use作為方法名,這里用__call來實現重載,當調用use時由__call來調用私有的_add方法。
_add對傳進來的參數作判斷,如果是字符串,表示外部加載,則去判斷文件和處理函數是否存在和有效,然后將處理函數加到中間件隊列。
這里面如果use()傳遞空參數,表示忽略后面的中間件。run方法
添加完中間件后,執行$app -> run()方法運行,來看看是怎么執行的:
調用私有的_gen來生成一個生成器,該生成器可以迭代返回隊列中的中間件處理函數。
調用next方法執行下一個中間件(這里即第一個入口)
2.1 調用生成器的current方法獲得當前的處理函數
2.2 執行該函數(傳遞$this作為參數,即$ctx),并調用生成器的next方法后移到下一個處理函數
直到生成器沒有返回時結束。
中間件中需調用$ctx-> next()將控制權交到下一個中間件,從而迭代完所有的中間件。__get和__set方法
提供了__get和__set方法,是方便在中間件中使用$ctx直接設置和訪問未經定義的值。如:
$ctx -> body = "hello"; $ctx -> tplName = "a.tpl";That is all
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/26312.html
摘要:于是打算做一個擁有非常好用的路由和又非常簡單的框架。但也有一些自己的特色,例如支持自動化緩存自動化讀寫刷新保持與數據庫同步,對外使用無感知。例如協議服務器地址遠程的類不設置默認為當前類名其中類在框架里。 背景 在用過laravel框架,發現它的路由和數據庫ORM確實非常好用,但是整體確實有點慢,執行到控制器大于需要耗時60ms左右。于是打算做一個擁有非常好用的路由和orm又非常簡單的框...
摘要:源碼鏈接開發文檔如果你還不是很了解,或者認為只是一種規范不具有實際意義,推薦一篇兩年前的文章設計最佳實踐和的一篇極其理論的文章理解本真的架構風格雖然有點老,介紹的也很簡單,大家權當了解,的更多好處,還請擁有一樣的的簡潔設計,使用更簡單的框架 源碼鏈接:Resty 開發文檔 如果你還不是很了解restful,或者認為restful只是一種規范不具有實際意義,推薦一篇osc兩年...
摘要:要求通過要求數據變更函數使用裝飾或放在函數中,目的就是讓狀態的變更根據可預測性單向數據流。同一份數據需要響應到多個視圖,且被多個視圖進行變更需要維護全局狀態,并在他們變動時響應到視圖數據流變得復雜,組件本身已經無法駕馭。今天是 520,這是本系列最后一篇文章,主要涵蓋 React 狀態管理的相關方案。 前幾篇文章在掘金首發基本石沉大海, 沒什么閱讀量. 可能是文章篇幅太長了?掘金值太低了? ...
摘要:馨客棧前端導航享受的開發體驗,在中使用組件,同時可以使用來開發自定義主題。馨客棧每日分享為每個頁面預渲染生成靜態的,同時在頁面被加載的時候,將作為運行。 VuePress學習 全局安裝前我們需要Git和node這兩個軟件,關于怎么安裝可以我之前hexo的視頻教程 假如這兩個都沒有安裝好,那么下面就不需要看了哈,棧友們 全局安裝 首先我們先全局安裝一下 npm stall -g vuep...
摘要:馨客棧前端導航享受的開發體驗,在中使用組件,同時可以使用來開發自定義主題。馨客棧每日分享為每個頁面預渲染生成靜態的,同時在頁面被加載的時候,將作為運行。 VuePress學習 全局安裝前我們需要Git和node這兩個軟件,關于怎么安裝可以我之前hexo的視頻教程 假如這兩個都沒有安裝好,那么下面就不需要看了哈,棧友們 全局安裝 首先我們先全局安裝一下 npm stall -g vuep...
閱讀 4175·2023-04-26 02:40
閱讀 2663·2023-04-26 02:31
閱讀 2758·2021-11-15 18:08
閱讀 574·2021-11-12 10:36
閱讀 1435·2021-09-30 09:57
閱讀 5208·2021-09-22 15:31
閱讀 2633·2019-08-30 14:17
閱讀 1281·2019-08-30 12:58