日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hyperf自定义注解类_swoole学习六hyperf注解的使用

發布時間:2025/3/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hyperf自定义注解类_swoole学习六hyperf注解的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 什么是注解

對于開發java的同學來說注解是一種再熟悉不過的東西了,在代碼中一般無處不見注解的存在。php對于注解并沒有原生支持,但是有人做了公共包可以來使用。

那注解是什么,簡單來說注解是給程序擴展用的,當程序運行的注解會被解析到源代碼中,他的聲明有點像注釋,注釋是給程序員看的用來了解、熟悉某個類或者方法的具體用途、參數、屬性等等。而注解則會告訴程序,執行到這里的時候需要如何去做。

  • 如何使用的

先來看一下hyperf中的簡單使用

<?phpuse HyperfHttpServerAnnotationController;use HyperfHttpServerAnnotationGetMapping;/** * Class IndexController * @package AppController * //聲明這是一個控制器注解,其實Controller也是一個類,prefix是它的 // 一個屬性,這聲明了這個控制器的訪問路由,api/v1/test * @Controller(prefix="api/v1/test") */class IndexController extends AbstractController{ /** * @return array // GetMapping 用來說明這是個get請求方法 ,path代表路徑 * @GetMapping(path="index") */ public function index() { $user = $this->request->input('user', 'Hyperf'); $method = $this->request->getMethod(); return [ 'method' => $method, 'message' => "Hello {$user}.", ]; }}

我們啟動服務之后直接訪問 127.0.0.1:9501/api/v1/test/index 就可以

在如Laravel的框架中,我們會將路由配置在Router.php中,請求進來后會匹配文件中的路由,其實與這里的原理是差不多的,當然注解的功能要強大的多一些。

  • 如何起作用

先看注解的聲明

vendor/hyperf/http-server/src/Annotation/Controller.php

<?phpuse HyperfDiAnnotationAbstractAnnotation;/** 必須使用Annotation聲明這是一個注解類 * @Annotation target標識這個注解的使用范圍,可以作用的一個類上,不能用在func上 * @Target({"CLASS"}) */class Controller extends AbstractAnnotation{ /** * @var null|string 這個屬性代表,我們在使用的時候必須要傳入這個值 */ public $prefix = ''; /** * @var string */ public $server = 'http';}

我們說server啟動的時候會先掃描注解,并且解析,具體看ClassLoader方法,掃描后的注解會被放到container中,按照類對應的方法的注解等等。

當請求進來的時候會解析這個數據,如果是Controller或者Mapping的注解,會被解析到Router里面,綁定url對應的class及func,這樣就可以匹配到了。也就是[api/v1/test] => [IndexController, index]。

其他的注解也是這樣的流程,只不過是作用不同而已,我們也可以自定義注解。

  • 如何解析的呢

大家可以看下這個包,目前PHP所實現的注解都是基于這個,https://www.doctrine-project.org/projects/doctrine-annotations/en/latest/index.html, 其根本原理是利用反射,Reflection來實現,我們來個例子

reflection/index.php

<?phprequire __DIR__."/../vendor/autoload.php";/** * Class Phone * * @MyControllerAnnotion( * * prefix="v1/api" * ) * */class Phone{ public $version; public function call() { echo "is calling..."; }}/** * 假設是個自定義的注解類 * Class MyControllerAnnotion * * @Annotation */class MyControllerAnnotion{ public $prefix;}$class = new ReflectionClass(Phone::class);// 第一步獲取這個類的注釋$comment = $class->getDocComment();print_r($comment);// 第二部就要把這個注釋中的注解解析出來了,主要是正則匹配啥的了// 這個還真是有點復雜,我們使用人家的包來解析$reader = new DoctrineCommonAnnotationsAnnotationReader();$annitons = $reader->getClassAnnotation($class, MyControllerAnnotion::class);print_r($annitons);// 第三部摘出來注解之后,跟當前類進行關聯就行了,啥時候用取出來就可以了$container[$class->getName()]['class'][] = $annitons;print_r($container);// 第四部就是使用了,無非就是初始化注解,獲取他的屬性啥的

來看下結果

gaoz@nobodyMBP hyperf_study % php hyperf-skeleton/reflection/index.php/** * Class Phone * * @MyControllerAnnotion( * * prefix="v1/api" * ) * */MyControllerAnnotion Object( [prefix] => v1/api)Array( [Phone] => Array ( [class] => Array ( [0] => MyControllerAnnotion Object ( [prefix] => v1/api ) ) ))

目前看來這個東西真是大大提高效率,java的同學應該很有體會,通過注解,可以幫我們做很多準備工作,很可惜PHP的社區一直沒有出這個玩意

相關文檔

hypef中對于注解的說明:https://hyperf.wiki/2.0/#/zh-cn/annotation

注解解析工具:https://github.com/doctrine/annotations

相關代碼

https://github.com/nobody05/hyperf_study

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的hyperf自定义注解类_swoole学习六hyperf注解的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。