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

2022/2/24 6:22:06

本文主要是介绍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);

 



这篇关于Swoole实战之手撸HttpServer框架 9 使用方法注解 注册路由的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程