限制 Apigility 中的结果
Limit the results in Apigility
我创建了一个与 Apigility 相关联的代码 API。现在我正在使用标准的创建存根。在我的 PostResource
中有一个名为 fetchAll($params = array())
的方法。
我为该方法创建了代码,以便它 returns 一组可分页的结果:
/** @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 个结果都将从数据库中获取。一页只有 returns 5 个,但有 10 个是水合的
有没有办法在使用限制的同时让 Apigility 或分页器知道总共有多少结果,这样我就能得到 5 行并且仍然是分页?
我不完全知道你是如何检索数据的,但是下面的方法可以按预期工作:调用链看起来像 AddressResource#fetchAll(...) -> AddressService#getBar(...) -> AddressMapper#findAll(...)
和数据检索方法 returns 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,
...
),
...
),
...
);
现在进行测试:我正在调用 /addresses
并观察 MySQL 查询日志:
$ tail -f /var/log/mysql_query.log
...
3 Connect root@localhost on address-book-api
3 Query SET NAMES 'UTF8'
3 Query SELECT COUNT(1) AS `C` FROM (SELECT `addresses`.* FROM `addresses`) AS `original_select`
3 Query SELECT `addresses`.* FROM `addresses` LIMIT 5 OFFSET 0
3 Quit
...
我创建了一个与 Apigility 相关联的代码 API。现在我正在使用标准的创建存根。在我的 PostResource
中有一个名为 fetchAll($params = array())
的方法。
我为该方法创建了代码,以便它 returns 一组可分页的结果:
/** @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 个结果都将从数据库中获取。一页只有 returns 5 个,但有 10 个是水合的
有没有办法在使用限制的同时让 Apigility 或分页器知道总共有多少结果,这样我就能得到 5 行并且仍然是分页?
我不完全知道你是如何检索数据的,但是下面的方法可以按预期工作:调用链看起来像 AddressResource#fetchAll(...) -> AddressService#getBar(...) -> AddressMapper#findAll(...)
和数据检索方法 returns 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,
...
),
...
),
...
);
现在进行测试:我正在调用 /addresses
并观察 MySQL 查询日志:
$ tail -f /var/log/mysql_query.log
...
3 Connect root@localhost on address-book-api
3 Query SET NAMES 'UTF8'
3 Query SELECT COUNT(1) AS `C` FROM (SELECT `addresses`.* FROM `addresses`) AS `original_select`
3 Query SELECT `addresses`.* FROM `addresses` LIMIT 5 OFFSET 0
3 Quit
...