ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Swoole实战之手撸HttpServer框架 9 使用方法注解 注册路由

2022-02-24 02:32:07  阅读:234  来源: 互联网

标签:core HttpServer Swoole self instance php method 路由 RouterCollector


https://www.bilibili.com/video/BV14E411t7T4?p=13

 

 

1 添加方法注释

1.1  \app\controllers\UserController.php

use Core\annotations\RequestMapping;

 

/**
     * @RequestMapping(value="/user/test")
     *
     */
    public function test()
    {
       return "路由注释";
    }

 

2 添加RequestMapping注释

\core\annotations\RequestMapping.php

<?php
/**
 * Created by PhpStorm.
 * User: SUN
 * Date: 2022/1/29
 * Time: 21:03
 */

namespace Core\annotations;
use Doctrine\Common\Annotations\Annotation\Target;
/**
 * @Annotation
 * @Target({"METHOD"})
 */
class RequestMapping
{
   public $value='';//路径 如/api/test
   public $method = [];// GET。POST
}

3 路由收集器

\core\init\RouterCollector.php

<?php
namespace Core\init;
use Core\annotations\Bean;
/**
 * 路由收集器
 * @Bean()
 */
class RouterCollector
{
    public $routes = [];
    public function addRouter($method,$uri,$handler)
    {
       $this->routes[] = [
         'method'=>$method,
         'uri'=>$uri,
         'handler'=>$handler];
    }
}
View Code

4 载入init里的路由收集器 与添加处理方法的注释

\core\BeanFactory.php

 //扫描(重点)
        $scans = [
          //必须扫描的文件夹
          ROOT_PATH."/core/init"=>"Core\\",
          //用户配置的扫描路径
          self::_getEnv("scan_dir",ROOT_PATH."/app")=> self::_getEnv("scan_root_namespace","APP\\")
        ];
        //$scanDir = self::_getEnv("scan_dir",ROOT_PATH."/app");
        //$scanRootNamespace = self::_getEnv("scan_root_namespace","APP\\");
        foreach ($scans as $scanDir=> $scanRootNamespace){
            self::ScanBeans($scanDir,$scanRootNamespace);
        }
    private static function handlerMethodAnno(&$instance,\ReflectionClass $refClass,AnnotationReader $reader)
    {
        //读取反射对象的属性
        $methods = $refClass->getMethods();//取出所有的方法
        foreach ($methods as $method){
            //$prop必须是反射对象属性
            $methodAnnos = $reader->getMethodAnnotations($method);
            foreach ($methodAnnos as $methodAnno){
                //返回对象实例 obj 所属类的名字。如果 obj 不是一个对象则返回 FALSE
                $handler = self::$handlers[get_class($methodAnno)];
                $handler($method,$instance,$methodAnno);
            }
        }
    }

5 方法注释处理器

\core\annotationhandlers\RequestMapping.php

<?php
namespace Core\annotationhandlers;
use Core\annotations\RequestMapping;
use Core\BeanFactory;

return[
  //$methodAnnoSelf 注解本身
  RequestMapping::class=>function(\ReflectionMethod $method,$instance,$methodAnnoSelf){
    
     $path = $methodAnnoSelf->value;//uri;
     $requestMethod =  count($methodAnnoSelf->method)>0 ? $methodAnnoSelf->method:['GET'];
     $RouterCollector = BeanFactory::getBean("RouterCollector");
     
     $RouterCollector-> addRouter($requestMethod,$path,function() use($method,$instance){
         $method->invoke($instance);//执行反射方法
         
     });
    
     return $instance;
    
    }
];

6 测试

\test.php

$routerCollector= \Core\BeanFactory::getBean("RouterCollector");
var_dump($routerCollector->routes);

 

标签:core,HttpServer,Swoole,self,instance,php,method,路由,RouterCollector
来源: https://www.cnblogs.com/polax/p/15929943.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有