我使用Apigility创建了一个代码连接的API。现在我正在使用标准的创建存根。在我的PostResource
中,有一个名为fetchAll($params = array())
的方法。
我为方法创建了代码,以便返回一组可分页的结果:
/** @var HydratorInterface $hydrator */
$hydrator = new \Zend\Stdlib\Hydrator\ClassMethods();
/** @var PostService $postService */
$postService = new PostService();
$posts = $postService->findAll(/* Limit, default 10 */);
$apiData = array();
foreach ($posts as $post) {
$apiData[] = $hydrator->extract($post);
}
return new Paginator(new ArrayAdapter($apiData));
到目前为止,此工作正常。如果我导航到API URL,我将获得我的数据库数据的分页json
表示。如果我将我的API的页面大小设置为5.它将给我2页和5个结果。到现在为止还挺好。问题是,在每次调用(第1页或第2页)时,将从数据库中提取所有10个结果。它只在一页上返回5,但有10页是水合等。
有没有办法使用限制,但也让Apigility或分页器知道,总共有多少结果,这样我就会得到5行并且仍然是分页?
答案 0 :(得分:4)
我并不完全确切知道您是如何检索数据的,但是以下方法的工作原理如下:调用链看起来像AddressResource#fetchAll(...) -> AddressService#getBar(...) -> AddressMapper#findAll(...)
,数据检索方法返回{{ 1}}对象。
<强> Collection
强>
AddressResource.php
<强> ...
class AddressResource ... {
...
public function fetchAll($params = array()) {
$service = $this->getAddressService();
$collection = $service->getAddresses($params->toArray());
return $collection;
}
...
}
强>
AddressService.php
<强> ...
class AddressService ... {
...
public function getAddresses($params = array()) {
$collection = $this->getMapper()->findAll($params);
return $collection;
}
...
}
强>
AddressMapper.php
<强> ...
class AddressMapper extends AbstractDbMapper {
...
public function findAll($params = array()) {
$select = $this->getSelect();
$select->where(
...
);
$paginatorAdapter = $this->createPaginationAdapter($select);
$collection = new AddressCollection($paginatorAdapter);
return $collection;
}
...
}
强>
AddressCollection.php
<强> ...
use Zend\Paginator\Paginator;
class AddressCollection extends Paginator {
}
强>
module.config.php
现在进行测试:我正在调用return array(
...
'zf-rest' => array(
...
'AddressBookAPI\\V1\\Rest\\Address\\Controller' => array(
...
'page_size' => 5,
...
),
...
),
...
);
并观察MySQL查询日志:
/addresses