首页 > 其他分享 >Swoole实战之手撸HttpServer框架 20 ORM整合2 注解2 切换数据源

Swoole实战之手撸HttpServer框架 20 ORM整合2 注解2 切换数据源

时间:2022-09-27 01:44:13浏览次数:57  
标签:HttpServer 20 数据源 self DB prop controllers instance UserController

1反射原理的梳理

1.1 BeanFactory属性注解

seckill\pro\core\BeanFactory.php

    private static function handlerPropAnno(&$instance,\ReflectionClass $refClass,AnnotationReader $reader)
    {
       //读取反射对象的属性
        $props = $refClass->getProperties();
        foreach ($props as $prop){
            //$prop必须是反射对象属性
            $propAnnos = $reader->getPropertyAnnotations($prop);
            foreach ($propAnnos as $propAnno){
                //返回对象实例 obj 所属类的名字。如果 obj 不是一个对象则返回 FALSE
                $handler = self::$handlers[get_class($propAnno)];
                $handler($prop,$instance,$propAnno);
            }
        }
    }

其中

第一个参数


//读取反射对象的属性
$props = $refClass->getProperties();
 

第二个参数

$instance = self::$container->get($refClass->getName())

第三个参数

//$prop必须是反射对象属性
$propAnnos = $reader->getPropertyAnnotations($prop);

DB类自身

1.2 handler

seckill\pro\core\annotationhandlers\DBHandler.php

return [
    /**
     * @prop
     * object(ReflectionProperty)#48 (2) {
    ["name"]=>
    string(2) "db"
    ["class"]=>
    string(30) "App\controllers\UserController"
    }
 
     * @instance
     * object(App\controllers\UserController)#52 (2) {
    ["db":"App\controllers\UserController":private]=>
    NULL
    ["version"]=>
    string(3) "1.0"
    }
 
     * @self
     * object(Core\annotations\DB)#55 (1) {
    ["source"]=>
    string(6) "docker"
    }
     */
  DB::class=>function(\ReflectionProperty $prop,$instance,$self) {
      $mydbBean = BeanFactory::getBean(MyDB::class);   //从新获取一个对象
      $mydbBean ->setDbSource($self->source);//annotations/DB 里设置的数据源
      $prop->setAccessible(true);   //
      $prop->setValue($instance,$mydbBean);
      return $instance;
  }
];

第一个参数\ReflectionProperty $prop $prop

来源于 \controllers\UserController.php

第二次参数 $instance

是指\controllers\UserController的实例

第三个参数 $self

seckill\pro\core\annotations\DB.php的实例

 

标签:HttpServer,20,数据源,self,DB,prop,controllers,instance,UserController
From: https://www.cnblogs.com/polax/p/16733133.html

相关文章