分页
Hymie PHPMVC 框架的分页模块采用适配器模式实现,目前支持 PDO 分页以及 Medoo 数据库框架分页。其中 PDO 目前支持 mysql 数据库分页,其他数据库分页后续会完成开发。
一、获取分页类
-
\hymie\pager\Pager使用该类的工厂方法public static function getPager($adapterObjOrClassName, ...$params)创建具体分页适配器.-
$adapterObjOrClassName\PDO或者Medoo\Medoo实例- 类名用于构造用户自定义的分页适配器
$params
适配器的构造函数参数, 具体参考适配器构造函数
-
-
分页方法
$pager->doPage($page, $pageSize)-
$page当前页
默认分页类是从$_GET、$_POST、$_REQUEST全局数组中获取分页参数, 单也可以在工厂方法中传递分页参数, 这通常适用于 PathVariable 类型的分页. $pageSize每页数据条数
默认分页类是从$_GET、$_POST、$_REQUEST全局数组中获取分页参数, 单也可以在工厂方法中传递分页参数, 这通常适用于 PathVariable 类型的分页. 默认 10
doPage方法执行完后,会在$_REQUEST数组中保存自己的实例,$key值为_pager -
二、分页适配器
2.1 系统原生的适配器有
-
\hymie\pager\adapter\PdoPagerAdapter(已实现)PDO 分页, 此分页类还使用
\hymie\pager\adapter\dialect命名空间下的分页数据库 dialect 类.\hymie\pager\adapter\dialect\MysqlPdoDialectmysql分页方言 (已实现)\hymie\pager\adapter\dialect\OciPdoDialectoracle 分页方言 (暂未实现)\hymie\pager\adapter\dialect\PgsqlPdoDialectpostgreSQL 分页方言 (暂未实现)\hymie\pager\adapter\dialect\SqlsrcPdoDialectSQLServer 分页方案 (暂未实现)
PDO 分页适配器会根据 PDO 的链接属性选择正确的分页方言类
\hymie\pager\adapter\MedooPageAdapter(已实现)
Medoo 分页类,如果想使用
Medoo::query函数分页,建议使用如下方式$medoo = get_bean('medoo'); $sql = "select * from area where levelNum like ? order by areaNum desc"; $pager = \hymie\pager\Pager::getPager($medoo->pdo, $sql, '11%', [PDO::FETCH_CLASS, "\\beans\\Area"]);因为如果使用
Medoo::query方法分页,实际上使用了与数据库依赖的语句,因此直接获取Medoo::$pdo对象用PdoPageAdapter分页即可
2.2 分页示例
// config.bean.php
$beans = array();
$beans['pdo'] = [
'class' => 'PDO',
'construct-args' => [
'dsn' => 'mysql:dbname=gszx;host=127.0.0.1',
'user' => 'root',
'password' => '123456',
[\PDO::ATTR_PERSISTENT => true]
]
];
$beans['medoo'] = [
'class' => 'Medoo\Medoo',
'construct-args' => [
['database_type' => 'mysql',
'database_name' => 'gszx',
'server' => '127.0.0.1',
'username' => 'root',
'password' => '123456']
]
];
$GLOBALS['_beans'] = &$beans;
// some_service.php
$pdo = get_bean('pdo');
$sql = "select * from area where levelNum like ? order by areaNum desc";
$pager = \hymie\pager\Pager::getPager($pdo, $sql, '11%', [PDO::FETCH_CLASS, "\\beans\\Area"]);
$pager->doPage();
$data = $pager->getData();
// some_other_service.php
$medoo = get_bean('medoo');
$pager = \hymie\pager\Pager::getPager($medoo, 'area', '*');
$pager->doPage(15);
$data = $pager->getData();
更多的实例请参考 tests/hymie/PagerTest.php
三、实现自己的分页适配器
通过实现 hymie\pager\adapter\PagerAdapterInterface 接口来实现自己的分页适配器, 在调用 \hymie\pager\Pager::getPager($adapterObjOrClassName, ...$params) 方法时需要使用类名(包含命名空间)
// 自定义分页适配器
<?PHP
namespace myproject\pager;
class ArrayPagerAdapter implements PagerAdapterInterface
{
private $array;
public function __construct()
{
$array = [];
for ($i = 0; $i < 1000; $i++) {
$array[] = $i;
}
$this->setArray($array);
}
public function getDataCount()
{
return count($this->array);
}
public function getData($page, $pageSize)
{
return array_slice($this->array, $page * $pageSize, $pageSize);
}
public function getArray()
{
return $this->array();
}
public function setArray($value)
{
$this->array = $value;
}
}
?>
<?PHP
class SomeService
{
public function doSome()
{
$pager = \hymie\Pager::getPager("myproject\pager\ArrayPagerAdapter");
$pager->doPage(1);
return $pager->getData();
}
}
?>