hyperf使用需要注意的地方

2021-10-12 06:06:37 字數 3644 閱讀 1661

jwt datetimeimmutable 報錯:

jwt datetimeimmutable 問題 降低版本到3.3.3解決問題: composer require lcobucci/jwt:3.3.3

hyperf使用註解的坑,hyperf使用註解會讓註解的例項變為單例,

問題1:model產生問題 ***

如果我們註解乙個model給變數,當有兩個地方會查詢資料,第乙個查詢會是a+b連線查詢,第二個是a+b+c連線查詢,如果第二個查詢有乙個引數時c的,執行二后在執行第乙個會導致報錯,報c中的引數不存在,單位這個例項是單例的,第二個查詢的引數不會被清除,

問題二:例項化時如果帶引數 ***

如果例項化帶引數,第乙個例項化帶了乙個引數,第二個操作時不會重新例項化,這樣會導致第二次使用還是第一次的引數,導致出錯

問題三:公共屬性

在控制器中乙個屬性被改變,後面再有請求來獲取屬性時獲取到是最新的,不是初始化的,

inject或value註解不生效

使用了建構函式中注入injectvalue的功能,以下兩種場景,可能會導致注入失效,請注意使用。

原類沒有使用injectvalue,但父類使用了injectvalue,且原類寫了建構函式,同時又沒有呼叫父類建構函式的情況。

這樣就會導致原類不會生成**類,而例項化的時候又呼叫了自身的建構函式,故沒辦法執行到父類的建構函式。

所以父類**類中的方法__handlepropertyhandler就不會執行,那麼injectvalue註解就不會生效。

class parentclass 

class origin extends parentclass

}

原類沒有使用injectvalue,但trait中使用了injectvalue

這樣就會導致原類不會生成**類,故沒辦法執行建構函式裡的__handlepropertyhandler,所以traitinjectvalue註解就不會生效。

trait origintrait 

class origin

基於上述兩種情況,可見原類是否生成**類至關重要,所以,如果使用了帶有injectvaluetrait父類時,給原類新增乙個inject,即可解決上述兩種情況。

use hyperf\contract\stdoutloggerinte***ce;

trait origintrait

class parentclass

class origin extends parentclass

一般建議使用make,而不是new,

使用 make() 方法是為了允許 aop 的介入,而直接 new 會導致 aop 無法正常介入流程 2.0以後不會有這個問題,這個可以參考

注意事項

換種方式理解就是容器內管理的物件都是單例,這樣的設計對於長生命週期的應用來說會更加的高效,減少了大量無意義的物件建立和銷毀,這樣的設計也就意味著所有需要交由 di 容器管理的物件均不能包含狀態值。

狀態可直接理解為會隨著請求而變化的值,事實上在 協程 程式設計中,這些狀態值也是應該存放於協程上下文中的,即hyperf\utils\context

有些時候我們可能希望去實現一些更動態的需求時,會希望可以直接獲取到容器(container)物件,在絕大部分情況下,框架的入口類(比如命令類、控制器、rpc 服務提供者等)都是由容器(container)建立並維護的,也就意味著您所寫的絕大部分業務**都是在容器(container)的管理作用之下的,也就意味著在絕大部分情況下您都可以通過在建構函式(constructor)宣告或通過@inject註解注入psr\container\containerinte***ce介面類都能夠獲得hyperf\di\container容器物件,我們通過**來演示一下:

;中介軟體的執行順序

執行順序為:全域性中介軟體 -> 類級別中介軟體 -> 方法級別中介軟體

全域性更改請求和響應物件

首先,在協程上下文內是有儲存最原始的 psr-7請求物件響應物件的,且根據 psr-7 對相關物件所要求的不可變性(immutable),也就意味著我們在呼叫$response = $response->with***()所呼叫得到的$response,並非為改寫原物件,而是乙個clone出來的新物件,也就意味著我們儲存在協程上下文內的請求物件響應物件是不會改變的,那麼當我們在中介軟體內的某些邏輯改變了請求物件響應物件,而且我們希望對後續的 非傳遞性的 **再獲取改變後的請求物件響應物件,那麼我們便可以在改變物件後,將新的物件設定到上下文中,如**所示:

;// $request 和 $response 為修改後的物件

$request

= \hyperf\utils\context::

set(serverrequestinte***ce:

:class

,$request);

$response

= \hyperf\utils\context::

set(responseinte***ce:

:class

,$response

);

使用strncpy需要注意的地方

功能 c c 複製src中的內容 字元,數字 漢字.到dest,複製多少由num的值決定,返回指向dest的指標。如果遇到null字元 0 且還沒有到num個字元時,就用 num n n是遇到null字元前已經有的非null字元個數 個null字元附加到destination。注意 並不是新增到de...

使用巨集需要注意的地方

ddk提供了大量的巨集。在使用這些巨集的時候,要注意一種錯誤的發生,這就是 側效 side effect 巨集一般由多行組成,如下面的形式,其中的 代表換行 define print msg kdprint n kdprint msg kdprint n 在c語言中規定,for或者if語句塊中的內容...

使用setById時需要注意的地方

在使用listview的時候,通常要對某個item中的乙個控制項進行操作,那麼我們就需要取得這個控制項的引用 這個時候可以使用view.setid int id 來設定乙個id值,然後再通過view.getviewbyid int id 精確得取得該控制項 舉個例子 override public ...