# Model 可以在此层级上划分出业务层和数据层,开发者可以根据自己的喜好来创建相应的文件夹。 比如app/Models/Data/这个目录下存放数据层,app/Models/Business/这个目录存放业务层。 ## Loader 可以通过loader加载其他的model,如果是多层model可以直接包含文件夹名称进行loader,也可以是用class进行loader。 ```php $this->loader->model("Data/TestModel",$this); $this->loader->model(TestModel::class,$this); ``` ## 使用数据库 ```php $result = $this->redis_pool->getCoroutine()->get('testroute'); $result = $this->db->select('*') ->from('account')->limit(1) ->coroutineSend(); ``` ## __construct 对象池模式Model会被复用,整个生命周期中__construct只会执行一次。 ```php class TestModel extends Model { public function __construct() { parent::__construct(TestModelProxy::class); } } class TestModelProxy extends ChildProxy { public function test_exception() { $this->beforeCall("test_exception"); return $this->own->test_exception(); } } ``` 上面是高级用法,设置AOP代理,默认每个Model都有层AOP代理,这里可以自定义AOP代理。 ## initialization 通过重写initialization进行Model的初始化,每次Loader Model的时候都会执行initialization方法,不建议在__construct进行初始化因为是对象池模式Model会被复用,而在整个生命周期中__construct只会执行一次。 ## 获取异步连接池 首先需要在AppServer中创建连接池 ```php public function initAsynPools() { parent::initAsynPools(); $this->addAsynPool('GetIPAddress',new HttpClientPool($this->config,'http://int.dpool.sina.com.cn')); $this->addAsynPool('WeiXinAPI',new HttpClientPool($this->config,'https://api.weixin.qq.com')); } ``` 然后在Model的initialization方法中获取 ``` protected $GetIPAddressHttpClient; public function initialization() { parent::initialization(); $this->GetIPAddressHttpClient = get_instance()->getAsynPool('GetIPAddress'); } ``` > Mysql多库就是创建多个Mysql连接池实现的,但是Mysql连接池需要多一个步骤 ``` public function initialization() { parent::initialization(); $this->mysql2 = get_instance()->getAsynPool('mysql2'); $this->installMysqlPool($this->mysql2); } ```