【问题标题】:Limit the results in Apigility在 Apigility 中限制结果
【发布时间】:2015-07-28 10:09:39
【问题描述】:

我使用 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 行并且仍然分页?

【问题讨论】:

  • 也许看看DbSelect 分页器适配器? --> framework.zend.com/manual/current/en/modules/…
  • 默认集合扩展Zend\Paginator\Paginator,因此如果您使用标准存根,您所描述的行为不应出现。你的调用链是什么样子的?像这样:FooResource#fetchAll(...) -> FooService#getBar(...) -> FooMapper#findAll(...)? FooMapper#findAll(...) 是否返回 FooCollectionfindAll($params = array()) { $select = $this->getSelect(); $select->where(...); $paginatorAdapter = $this->createPaginationAdapter($select); $collection = new FooCollection($paginatorAdapter); return $collection; }

标签: php pagination zend-framework2 laminas-api-tools


【解决方案1】:

我不确切知道您是如何检索数据的,但是以下方法可以正常工作:调用链看起来像 AddressResource#fetchAll(...) -> AddressService#getBar(...) -> AddressMapper#findAll(...),而数据检索方法返回一个 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

...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    相关资源
    最近更新 更多