• Swoole实战之手撸HttpServer框架 12 RequestMapping注释完善(2) 支持Request对象的控制器方法和参数


    视频 https://www.bilibili.com/video/BV14E411t7T4?p=17&spm_id_from=pageDriver&vd_source=4a69745b599dffec877b0fcfe130b092

    代码

    1 pro\index.php

     case FastRoute\Dispatcher::FOUND:
                $handler = $routeInfo[1];
                $vars = $routeInfo[2];//参数
                //var_dump($vars);
               /* array(1) {
                            ["uid"]=>
                  string(3) "123"
                }*/
                // ... call $handler with $vars
                $extVars = [$myRequest];
                // $vars 路由上带的参数
                // $extVars 附加参数 传入 Request 、Response对象等
                $response->end($handler($vars,$extVars)); //最终执行的目标方法
                break;

    2 \pro\app\controllers\UserController.php

    use Core\Http\Request;
        /**
         * @RequestMapping(value="/user/{uid:\d+}")
         * 讲Request对象注入到
         * $aaa 干扰参数 没什么用 冗余
         */
        public function user(int $uid,Request $r)
        {
           // var_dump($r);
            var_dump($r->getQueryParams());
            return "bbb---".$uid;
        }

    3  pro\core\annotationhandlers\RequestMapping.php

         $RouterCollector-> addRouter($requestMethod,$path,function($params,$extParams) use($method,$instance){
             //return $method->invoke($instance);//执行反射方法
             $inputParams=[];
             //得到方法的反射参数
             $refParams=$method->getParameters();
             foreach ($refParams as $refParam){
                 if(isset($params[$refParam->getName()])){
                     $inputParams[] =  $params[$refParam->getName()];
                 }else{
                     //$extVar 都是实例对象,比如 Request 、Response
                     foreach($extParams as $extParam){
                         //$refParam->getClass 获取参数Request $request的类型
                         //var_dump($refParam);
                         if($refParam->getClass()->isInstance($extParam)){
                             $inputParams[]  = $extParam;
                             continue;
                         }
                     }
                     $inputParams[] = false;
                 }
             }
             return $method->invokeArgs($instance,$inputParams);
         });

    测试

    bug修复 参数注入时一个顺序bug

    讲参数的顺序打乱

    \pro\app\controllers\UserController.php

      /**
         * @RequestMapping(value="/user/{uid:\d+}")
         * 讲Request对象注入到
         * $aaa 干扰参数 没什么用 冗余
         */
        public function user(int $bbb,Request $r,int $uid,int $aaa)
        {
            
           // var_dump($r);
            var_dump($r->getQueryParams());
            return "bbb---".$uid;
        }

    \pro\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($params,$extParams) use($method,$instance){
             //return $method->invoke($instance);//执行反射方法
             $inputParams=[];
             //得到方法的反射参数 比如 (Request $r,int $uid,int $aaa)
             $refParams=$method->getParameters();
             
            /* var_dump($refParams);
             exit;*/
             //value="/user/{uid:\d+}"
                /*[0]=>
                  object(ReflectionParameter)#35 (1) {
                  ["name"]=>
                    string(3) "uid"
                  }*/
             foreach ($refParams as $refParam){
                 if(isset($params[$refParam->getName()])){
                     $inputParams[] =  $params[$refParam->getName()];
                 }else{
                     //$extVar 都是实例对象,比如 Request 、Response
                     foreach($extParams as $extParam){
                         if($refParam->getClass() &&  $refParam->getClass()->isInstance($extParam)){
                             $inputParams[]  = $extParam;
                             //continue;      //有bug
                             goto abc;
                         }
                     }
                     $inputParams[] = false;
                 }
                 abc:
             }
             return $method->invokeArgs($instance,$inputParams);
         });
        
         return $instance;
        
        }
    ];
  • 相关阅读:
    git 的分支体系命令汇总
    git命令行学习思路总结
    angular1.5版本的自我认识
    我最想去的公司啊 -- 幸福面试两小时
    【转】【Asp.Net MVC】asp.net mvc Model验证总结及常用正则表达式
    时间被序列化后的页面显示的问题
    JS组件Bootstrap实现弹出框和提示框效果代码
    Bootstrap组件之导航条
    Bootstrap学习笔记(四)-----Bootstrap每天必学之表单
    Bootstrap学习笔记(三)-----Bootstrap每天必学之表格
  • 原文地址:https://www.cnblogs.com/polax/p/16421825.html
Copyright © 2020-2023  润新知