百木园-与人分享,
就是让自己快乐。

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

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

<?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);

 


来源:https://www.cnblogs.com/polax/p/15929943.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » Swoole实战之手撸HttpServer框架 9 使用方法注解 注册路由

相关推荐

  • 暂无文章