在webman中,在一個(gè)進(jìn)程中,靜態(tài)變量、(單例)都是所有請(qǐng)求中共享使用,那么有沒有可以做到在僅僅在一個(gè)請(qǐng)求中,某個(gè)(單例)類可以在這個(gè)請(qǐng)求業(yè)務(wù)任意一個(gè)地方可以使用,不需要重復(fù)實(shí)例化呢(不同請(qǐng)求之間不能互相使用),這個(gè)類在這個(gè)請(qǐng)求結(jié)束后自動(dòng)釋放?
舉個(gè)例子
1、目前l(fā)og類實(shí)例化后(同一個(gè)通道),在一個(gè)進(jìn)程后就只有一個(gè)日志類(全局日志類),但我想在每次寫日志時(shí)都要附帶上額外的信息(本次請(qǐng)求的信息【包括我自定義的信息】或者用戶個(gè)人信息),要是我每次寫入的時(shí)候就加上額外信息(如:Log::info($user->username.'log test')),那我覺得有點(diǎn)麻煩,所以我繼承并改寫了Log類,新增一個(gè)方法可以做到每次實(shí)例化時(shí)都時(shí)一個(gè)新類,那么這個(gè)類就只為本次請(qǐng)求服務(wù),但問題來了,我如何可以在本次請(qǐng)求中任意協(xié)程、任意類中使用他呢,不需要每次都實(shí)例化一個(gè)新類,就像傳統(tǒng)web那樣的單例模式
上個(gè)問題不是有說用Context么
也試過這個(gè)方法,嘗試在中間件中使用Context,然后在控制器中使用Context獲取,但發(fā)現(xiàn)不行(我用了協(xié)程的),后來在手冊(cè)的某個(gè)頁(yè)面看到$request(support\Request;)變量,就想到了把本次請(qǐng)求的所有全局變量都放到這里,比如$request->userlog=Log::diyChannel('log2')【我新增的方法,每次都實(shí)例化新的實(shí)例】,然后在其他地方用,其余的辦法就想不到了
你需要重寫創(chuàng)建協(xié)程的方法, 在創(chuàng)建協(xié)程的時(shí)候 把request 的信息放到 context 里面
你想要把數(shù)據(jù)放在本次請(qǐng)求里面,實(shí)際上你的問題已經(jīng)給了你答案,就是將數(shù)據(jù)放到request對(duì)象里面即可。如何控制加載這個(gè)數(shù)據(jù)的時(shí)機(jī),可以看一下中間件章節(jié)的文檔,如果是請(qǐng)求開始就需要加入就在全局中間件里面加載數(shù)據(jù),如果是用戶信息的數(shù)據(jù)應(yīng)該是在驗(yàn)證token或者session的中間件里面增加數(shù)據(jù)加載邏輯