2015-05-16 14 views
5

Tôi đã tạo một API được kết nối mã với Khả năng truy cập. Bây giờ tôi đang sử dụng tiêu chuẩn tạo ra sơ khai. Trong số PostResource của tôi có một phương pháp được gọi là fetchAll($params = array()). Tôi đã tạo mã cho phương thức sao cho nó trả về tập hợp kết quả có thể thu thập được:Giới hạn kết quả trong Apigility

/** @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)); 

Điều này làm việc tốt cho đến nay. Nếu tôi điều hướng đến URL API, tôi sẽ nhận được một số tham chiếu được phân trang json dữ liệu DB của tôi. Nếu tôi đặt kích thước trang cho API của tôi thành 5. Nó sẽ cho tôi 2 trang và 5 kết quả. Càng xa càng tốt. Vấn đề là, trên mỗi cuộc gọi (trang 1 hoặc trang 2) tất cả 10 kết quả sẽ được lấy từ DB. Nó chỉ trả về 5 tại một trang nhưng 10 là ngậm nước, vv

Có cách nào để sử dụng giới hạn nhưng cũng để cho Apigility hoặc paginator biết, có bao nhiêu kết quả trong tổng số để tôi nhận 5 hàng phân trang?

+1

Có lẽ có một cái nhìn tại 'Bộ điều hợp bộ chuyển đổi' DbSelect'? -> http://framework.zend.com/manual/current/en/modules/zend.paginator.usage.html#the-dbselect-adapter – Crisp

+0

Theo các bộ sưu tập mặc định mở rộng 'Zend \ Paginator \ Paginator', vì vậy nếu bạn đang sử dụng cuống tiêu chuẩn, hành vi bạn mô tả sẽ không xuất hiện. Chuỗi cuộc gọi của bạn trông như thế nào? Như thế này: 'FooResource # fetchAll (...) -> FooService # getBar (...) -> FooMapper # findAll (...)'? 'FooMapper # findAll (...)' có trả về 'FooCollection' không? 'findAll ($ params = array()) { \t $ select = $ this-> getSelect(); \t $ select-> where (...); \t $ paginatorAdapter = $ this-> createPaginationAdapter ($ select); \t $ collection = new FooCollection ($ paginatorAdapter); \t trả về bộ sưu tập $; } ' – automatix

Trả lời

4

Tôi không biết chính xác, cách bạn truy xuất dữ liệu, nhưng cách tiếp cận sau hoạt động như mong muốn: Chuỗi cuộc gọi trông giống như AddressResource#fetchAll(...) -> AddressService#getBar(...) -> AddressMapper#findAll(...) và phương thức truy xuất dữ liệu trả về đối tượng 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, 
      ... 
     ), 
     ... 
    ), 
    ... 
); 

Bây giờ một thử nghiệm: Tôi gọi /addresses và quan sát nhật ký truy vấn MySQL:

$ tail -f /var/log/mysql_query.log 

... 

3 Connect [email protected] 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 

... 
Các vấn đề liên quan