把ThinkPHP的官方文檔擼了3遍以上,Webman擼了兩邊,再加上實際項目的開發(fā)和對比,才有的本文章,希望能幫到大家,如有錯誤和疏漏請不吝賜教~
1、webman內(nèi)存常駐,業(yè)務(wù)執(zhí)行只有3個流程(框架接收請求、框架執(zhí)行業(yè)務(wù)邏輯、框架將結(jié)果返回給客戶端);TP業(yè)務(wù)流程從 nginx/apache接收請求 到 php-fpm初始化環(huán)境,如創(chuàng)建變量列表 到 框架初始化(載入 Composer 的自動加載 autoload 文件 開始),如實例化各種類,包括如容器、控制器、路由、中間鍵等 到 數(shù)據(jù)庫、Redis的連接、使用釋放 到 php-fpm釋放資源、銷毀所有類定義、實例、銷毀符號表等 到 php-fpm將結(jié)果轉(zhuǎn)發(fā)給nginx/apache 到 nginx/apache將結(jié)果返回給客戶端 等很多重復步驟。
2、webman沒有pathinfo,只能使用常規(guī)POST、GET等來傳遞參數(shù),但可以用路由來定義參數(shù)來實現(xiàn)類似功能;TP有pathinfo,默認為 參數(shù)/值。。。,可配置格式(個人感覺過度封裝)。
3、webman默認不支持自動注入(需要安裝插件),每個方法的第一個參數(shù)貌似必須是Request對象,后面才是相關(guān)的路由變量傳遞的參數(shù);TP默認支持自動注入(將參數(shù)中的對象自動注入容器中已有的對應(yīng)類型)。
4、Request、Response、Controller、Route、Middleware、view、ExceptionHaddler、多應(yīng)用 方面,大體功能是差不多的,Webman比較精簡,TP比較全面(有點凌亂不好記),有一些小區(qū)別:
多應(yīng)用:TP單和多只能使用一種;而Webman默認兩種同時可用(注意單應(yīng)用的路由有可能會和多應(yīng)用目錄沖突),也有多應(yīng)用模塊插件可以支持更多的功能。
中間件:Webman不支持控制器中間件,全局、應(yīng)用、路由中間件都大同小異。
路由:
a、TP的路由是一條條解析,匹配即進入,路由可重復定義;Webman稍有不同,定義時如果有相同路由,則控制臺會報錯無法啟動服務(wù)(好處是及時能發(fā)現(xiàn)錯誤)。
b、TP默認支持多個路由文件(route目錄,自動執(zhí)行),自動載入;而Webman默認單個路由文件(config目錄下的route.php)(稍微修改下可以做到類似的功能);
c、TP的多層次目錄,是用 . 來分隔;而1.4之后的版本的webman也支持多層次目錄,用 / 分隔。
d、路由規(guī)則的第一個參數(shù):Webman是 / 開頭,而TP不是;
e、TP的路由規(guī)則的第二個參數(shù):TP是[控制器類, '方法'],TP是 字符串(包含目錄、控制器名和方法)。
f、都不匹配的路由:TP是route::miss,Webman是route::fallback;
g、資源路由:第二個參數(shù) 和 指定方法 稍有不同;
h、TP的資源路由和Webman的資源路由名稱對應(yīng):
TP:['index', 'read', 'save', 'update', 'delete']
Webman:['index', 'show', 'store', 'update', 'destroy']
i、路由變量定義:
TP:用 <xx> 或 :xx,可選為:[:month] 或 <month?>
Webman:用{xx},可選為:[{xx}]
j、TP的 路由變量 也會出現(xiàn)在 Request 中讀取,而 Webman 沒有;
k、TP的路由變量的值,為字母、數(shù)字、.號、_號組成,其他的都不會出現(xiàn)(后面的也會被截斷);
Webman的路由變量的值,除了 #號、?號、/號、\號 外都支持。
l、路由變量的匹配:
TP:路由變量名 和 方法的參數(shù)名 必須一致,否則出錯,它會按 名稱 來給參數(shù)賦值;
Webman:路由變量名隨便定義,它會按 順序 給方法的參數(shù)一一賦值;
m、返回的路由地址區(qū)別:
TP:app('request')->rule()->getRule();
返回的路由地址 不是 /號 開頭,路由變量格式:<xx>;
Webman:$request->route->getPath();
返回的路由地址 以 /號 開頭,路由變量格式:{xx};
l、TP支持Delete的body,webman不支持,會交替循環(huán)的出現(xiàn)404錯誤。
5、插件、擴展、模塊:webman 的 plugin目錄 類似于 TP 的 extend目錄,不過webman的命名空間是以 plugin\ 開頭的,而TP的可以和普通使用一樣。
6、容器:TP有app()助手函數(shù)(其實就是Container::getInstance()->make),可以實例化對象(參數(shù)3控制是否為新建);webman是用 Container來實例化對象(get為重用,make為新建)。
TP可以用 bind 綁定 標識 到 容器 中(不知有何用)。
8、webman的輸出是輸出到控制臺,而TP是輸出到頁面。
9、Webman的config便捷函數(shù)可以獲取配置(配置名為文件名),但只讀(有插件可增刪改);TP需要使用 think\facade\Config::get('文件名') 和 set($d, '文件名')來操作,TP的可讀可寫;
10、Webman可用TP的validate、orm(Db和Model)、Cache(Redis)、Captcha。
11、TP默認支持 .env 文件;Webman需要安裝插件,或自己寫一個;
注意:Webman配置文件中若使用某方法,必須寫在helper.php 而非 function.php 中,因為載入配置時function還沒載入。
12、門面:Webman不支持,因為雖然方便書寫,但沒有代碼提示功能;
13、事件:TP默認支持;Webman需要安裝插件;
TP:可以手動注冊事件到處理器;Webman只能在 config/event.php 處理;
14、服務(wù):未知;
15、定時任務(wù):crontab插件
16、其他:
TP的控制器每次訪問都會重新構(gòu)造,并調(diào)用構(gòu)造函數(shù);Webman可以在 config/app.php 中開啟:'controller_reuse' => false,不推薦 action-hook 插件(有BUG);
附帶我開發(fā)和移植的兩個項目(精簡出的后臺框架)的地址:
Pear Admin TP:https://gitee.com/pear-admin/Pear-Admin-Think
Pear Admin Webman:https://gitee.com/leamus/pear-admin-webman (還有一點東西沒完善)
絕對好文。還有你的pear-admin很多人反饋非常棒