hyperf自定义注解类_swoole学习六hyperf注解的使用
- 什么是注解
對于開發(fā)java的同學來說注解是一種再熟悉不過的東西了,在代碼中一般無處不見注解的存在。php對于注解并沒有原生支持,但是有人做了公共包可以來使用。
那注解是什么,簡單來說注解是給程序擴展用的,當程序運行的注解會被解析到源代碼中,他的聲明有點像注釋,注釋是給程序員看的用來了解、熟悉某個類或者方法的具體用途、參數(shù)、屬性等等。而注解則會告訴程序,執(zhí)行到這里的時候需要如何去做。
- 如何使用的
先來看一下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中,按照類對應的方法的注解等等。
當請求進來的時候會解析這個數(shù)據,如果是Controller或者Mapping的注解,會被解析到Router里面,綁定url對應的class及func,這樣就可以匹配到了。也就是[api/v1/test] => [IndexController, index]。
其他的注解也是這樣的流程,只不過是作用不同而已,我們也可以自定義注解。
- 如何解析的呢
大家可以看下這個包,目前PHP所實現(xiàn)的注解都是基于這個,https://www.doctrine-project.org/projects/doctrine-annotations/en/latest/index.html, 其根本原理是利用反射,Reflection來實現(xiàn),我們來個例子
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);// 第三部摘出來注解之后,跟當前類進行關聯(lián)就行了,啥時候用取出來就可以了$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的社區(qū)一直沒有出這個玩意
相關文檔:
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注解的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: numpy 创建加一行_NumPy数据处
- 下一篇: 在envi做随机森林_随机森林原理介绍与