<?php
|
/**
|
* PhalApi_ModelProxy 模型Model代理 - 重量级数据获取的应对方案
|
*
|
* - 结合缓存,进行对重量级成本高的数据进行缓冲读取
|
* - 为了传递获取源数据而需要的参数,引入封装成值对象的PhalApi_ModelQuery查询对象
|
* - 具体子类需要实现源数据获取、返回缓存唯一key、和返回有效期
|
* - 仅在有需要的情况下,使用此Model代理
|
*
|
* <br>实例和使用示例:<br>
|
```
|
* class ModelProxy_UserBaseInfo extends PhalApi_ModelProxy {
|
*
|
* protected function doGetData($query) {
|
* $model = new Model_User();
|
*
|
* return $model->getByUserId($query->id);
|
* }
|
*
|
* protected function getKey($query) {
|
* return 'userbaseinfo_' . $query->id;
|
* }
|
*
|
* protected function getExpire($query) {
|
* return 600;
|
* }
|
* }
|
*
|
* //最终的调用
|
* $query = new PhalApi_ModelQuery();
|
* $query->id = $userId;
|
* $modelProxy = new ModelProxy_UserBaseInfo();
|
* $rs = $modelProxy->getData($query);
|
```
|
*
|
* @package PhalApi\Model
|
* @license http://www.phalapi.net/license GPL 协议
|
* @link http://www.phalapi.net/
|
* @author dogstar <chanzonghuang@gmail.com> 2015-02-22
|
*/
|
|
abstract class PhalApi_ModelProxy {
|
|
protected $cache;
|
|
/**
|
* 为代理指定委托的缓存组件,默认情况下使用DI()->cache
|
*/
|
public function __construct(PhalApi_Cache $cache = NULL) {
|
$this->cache = $cache !== NULL ? $cache : DI()->cache;
|
|
//退而求其次
|
if ($this->cache === NULL) {
|
$this->cache = new PhalApi_Cache_None();
|
}
|
}
|
|
/**
|
* 获取源数据 - 模板方法
|
*
|
* @param PhalApi_ModelQuery $query 查询对象
|
* @return mixed 返回源数据,但在失败的情况下别返回NULL,否则依然会穿透到此
|
*/
|
public function getData(PhalApi_ModelQuery $query = NULL) {
|
$rs = NULL;
|
|
if ($query === NULL) {
|
$query = new PhalApi_ModelQuery();
|
}
|
|
if ($query->readCache) {
|
$rs = $this->cache->get($this->getkey($query));
|
if ($rs !== NULL) {
|
return $rs;
|
}
|
}
|
|
// 这里,将获取耗性能的数据
|
$rs = $this->doGetData($query);
|
|
if ($query->writeCache) {
|
$this->cache->set($this->getKey($query), $rs, $this->getExpire($query));
|
}
|
|
return $rs;
|
}
|
|
/**
|
* 获取源数据 - 具体实现
|
*/
|
abstract protected function doGetData($query);
|
|
/**
|
* 返回唯一缓存key,这里将$query传入,以便同类数据根据不同的值生成不同的key
|
*/
|
abstract protected function getKey($query);
|
|
/**
|
* 返回缓存有效时间,单位为:秒
|
*/
|
abstract protected function getExpire($query);
|
}
|