我一直是TP的用戶,從v3、v5到v6都擼過幾遍官方教程,今年開始了解了CRMEB和二開,直到真正做項目,認識workerman也是從CRMEB的技術(shù)說明才知道的,看了workerman的介紹,真心感覺不錯,雖然剛出不久,但作者大神能把PHP還能玩成這花樣真是意想不到,相見恨晚吶,于是花了一周時間擼了官方教程,不得不說官方教程確實比TP的簡潔(TP的500多頁PDF),而且框架也是輕量的(不像TP有點過度封裝,啰啰嗦嗦),但TP也有一些方便實用的東西而Webman沒有的,看帖子作者不了解TP,所以我想著來簡單分享建議一下(菜鳥級別的)。
1、容器
TP6中有容器和依賴注入,調(diào)用其他類的方法時會非常便捷,而且默認是單例類(也可以選擇非單例),比如:
class Foo
{
public function __construct(Bar $bar)
{}
public function bar(Bar $bar)
{
// ...
}
}
$foo = invoke('Foo'); //自動注入構(gòu)造函數(shù)
$result = invoke(['Foo', 'bar']);//自動注入方法中
或者:$arrayItem = app('org\utils\ArrayItem'); //容器構(gòu)造
Webman中好像需要插件才支持依賴注入,但沒有容器的概念。
2、路由
TP6默認的路由是支持控制器中子目錄的,比如:
app\Controller\admin\Index.php,訪問時是:
/admin.index/方法名
而Webman中不可行,看了作者大神的帖子,可以對每個路由重新定義,也可以使用一段代碼來自動路由,但我覺得不太方便,而且發(fā)現(xiàn)會和多應(yīng)用的路由有一個沖突,比如:
app/test/Controller/Index.php
app/Controller/test/Index.php
同時存在時,Webman就報錯無法啟動了。。
另外,我覺得 自動路由優(yōu)先級應(yīng)該小于手動路由,不然手動路由就沒辦法存在了(都被替換掉了)
3、中間件
中間件兩個感覺差不多,雖然我沒用到控制器中間件,但感覺這個也是相對重要,希望還是能有~
4、事件
這個Webman還沒有,我想作者大神以后會加進去的。
5、其他
TP6的門面(Facade),感覺也方便那么一點,沒有其實也無所謂,就是靜態(tài)方式調(diào)用對象的方法,有了依賴注入或容器也差不多。
TP6的服務(wù)一直沒用到,所以也不清楚具體作用。。
另外,關(guān)于訪問的URL對應(yīng)的控制器、方法和參數(shù),官方說明不是很詳細,比如TP6中明確說:
/控制器/方法名/參數(shù)名1/參數(shù)/參數(shù)名2/參數(shù)。。。
而Webman沒有說明如何給控制器方法傳參,還得自己試(還是只能靠Get或Post?)
最后有個問題,Webman對大文件上傳有沒有好的現(xiàn)成的方案呢?
我會一直關(guān)注Workerman系列和作者大神的,目前先用TP6把這票干完,后面我的游戲引擎框架后臺會用GateWay試試,同時也試著參與貢獻下,對于我這種不會Java和Go的真是福音,哈哈~
愿這個框架會發(fā)揚光大~
非常好的分享,非常感謝。
1、workerman自帶容器,容器符合PSR11規(guī)范。容器默認不支持依賴注入。不過可以通過安裝 php-di/php-di
來支持依賴注入。因為并不是所有用戶都需要依賴注入,所以這部分沒有強制安裝,需要的用戶選擇安裝也很方便,參考依賴注入文檔
webman容器的用法就是PSR11規(guī)范的用法
use support\Container;
Container::get('類名');
Container::make('類名', [構(gòu)造函數(shù)參數(shù)]);
2、/admin.index/方法名
這樣的默認路由看起來不是很規(guī)范,webman不支持這樣的用法。路由有沖突需要給用戶一個提示(當(dāng)然報錯可能不是一個好的方案),否則有一個路由不生效用戶可能以為是bug調(diào)試很久。復(fù)雜的業(yè)務(wù)目錄路由目前沒有想到好的解決方案,如果你有歡迎提出。
3、控制器中間件后面會支持
4、這個有插件,在 http://m.wtbis.cn/plugin/64 ,還沒來得及寫文檔
5、門面感覺有點雞肋,不支持智能提示,手寫一個靜態(tài)代理類感覺更簡單。當(dāng)然有需要的用戶可以自己實現(xiàn)一個門面,放到插件市場給大家使用。
再次感謝你的建議分享,也希望大家多建議分享自己的想法
謝謝作者大神回復(fù)~依賴注入那節(jié)不小心跳過了沒看,原來是有容器的啊哈哈,抱歉抱歉~再有幾個問題希望能不厭其煩的解答下:
1、自動路由會產(chǎn)生單、多應(yīng)用可能沖突,導(dǎo)致Webman無法運行的問題,TP的做法是默認單應(yīng)用,如果開啟多應(yīng)用的話單應(yīng)用就會自動關(guān)閉,不知這種解決方案如何。
2、其實平時也用不到復(fù)雜路由的情況,我覺得自動路由已經(jīng)滿足需求了,但自動路由如何和路由中間件結(jié)合呢?
3、Wokerman不能像TP那樣用PATHINFO給控制器和方法傳參嗎:
URL:/Example/func/param1/hello
PHP:
class Example {
public func($param1) {。。。}
}
還是只能使用 POST 和 GET傳參?
4、有木有大文件上傳的案例或者示例、解決方案什么的文章,想?yún)⒖枷聗
謝謝~
1、路由沖突解決下就好了,感覺因此關(guān)閉單應(yīng)用并不是用戶想要的方案
2、如果需要路由中間件需要在config/route.php中單獨配置
3、目前不支持這樣的用法,感覺這樣會有和默認路由沖突的情況,如果需要美化可以設(shè)置自定義路由實現(xiàn)
4、webman本身沒有在內(nèi)部支持大文件分段上傳。分段上傳屬于業(yè)務(wù)邏輯范疇。普通文件上傳是支持的,如果上傳的文件較大需要設(shè)置congfig/server.php max_package_size選項
2、我使用了自動路由插件(https://github.com/webman-php/auto-route),但我還想對其中某些路由增加中間件的話,貌似就不能用自動路由了,會有 FastRoute\BadRouteException: Cannot register two routes matching "/test/index/index" for method "GET" 的重復(fù)定義路由的錯誤(TP里不會對重復(fù)的報錯,而是按先匹配的進入)。。
其他問題基本了解了~
感覺先匹配進入不是很好,開發(fā)者本來期望進入后面的,但是實際進入前面的,開發(fā)者為此可能要debug很久才找出問題。直接報錯告訴開發(fā)者路由沖突了,讓開發(fā)者決定使用哪個路由好些
自動路由方便的一點是可以自動識別多種目錄結(jié)構(gòu)的控制器,手動路由可以定義路由組、中間件等等??磥碜詣勇酚珊褪謩勇酚芍荒芏x一了,如果能有更好的方案我再來提供,謝謝作者大神了~
Container::get(BalanceService::class)->updateUserAmount($user, [
'amount' => Common::toInt($data['amount']),
'type' => BalanceLog::PLATFORMRECHARGE,
'remark' => $data['remark']
]);
我這樣寫 phpstorm updateUserAmount 對這個方法顯示未使用 不高亮