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


    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);
  • 相关阅读:
    各项硬件使用剖析(一)---让你一眼就能区分瓶颈是Memory、processor ORdisk!
    基本算术运算符
    网页计算器 && 简易网页时钟 && 倒计时时钟
    页面加载后累加,自加1&&判断数字是否为两位数
    累加按钮,自加1&&输入两个数字,比较大小
    用typeof查看数据类型&&用parseInt解析数字,并求和
    鼠标移过,改变图片路径
    单一按钮显示/隐藏&&提示框效果
    简易选项卡&&简易JS年历
    函数传参,改变Div任意属性的值&&图片列表:鼠标移入/移出改变图片透明度
  • 原文地址:https://www.cnblogs.com/polax/p/15929943.html
Copyright © 2020-2023  润新知