2015-05-16 4 views
5

में परिणामों को सीमित करें मैंने अपग्रेडिटी के साथ एक कोड कनेक्ट एपीआई बनाया है। अभी के लिए मैं मानक बनाने स्टब्स का उपयोग कर रहा हूँ। मेरे PostResource में fetchAll($params = array()) नामक एक विधि है। इतना है कि यह परिणामों के एक paginatable सेट रिटर्न मैं विधि के लिए कोड बनाया:अपरिहार्यता

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

यह ठीक अब तक काम करता है। अगर मैं एपीआई यूआरएल पर नेविगेट करता हूं तो मुझे अपने डीबी डेटा का एक अंकनित json का प्रतिनिधित्व मिलेगा। अगर मैं अपने एपीआई के लिए पृष्ठ आकार 5 पर सेट करता हूं तो यह मुझे 2 पेज और 5 परिणाम देगा। अब तक सब ठीक है। समस्या यह है कि प्रत्येक कॉल (पृष्ठ 1 या पृष्ठ 2) पर सभी 10 परिणाम डीबी से प्राप्त किए जाएंगे। यह केवल एक पृष्ठ पर 5 लौटाता है लेकिन 10 हाइड्रेटेड इत्यादि हैं।

क्या सीमा का उपयोग करने का कोई तरीका है लेकिन अपग्रेडिटी या पेजिनेटर को यह भी पता है कि कुल में कितने परिणाम हैं ताकि मुझे 5 पंक्तियां मिलें और अभी भी अंकन?

+1

शायद पर एक नज़र 'डीबी चयन करें 'पेजिनेटर एडाप्टर? -> http://framework.zend.com/manual/current/en/modules/zend.paginator.usage.html#the-dbselect-adapter – Crisp

+0

डिफ़ॉल्ट संग्रह से 'ज़ेंड \ पेजिनेटर \ पेजिनेटर' बढ़ाएं, इसलिए यदि आप मानक स्टब्स का उपयोग कर रहे हैं, जो व्यवहार आप वर्णन कर रहे हैं वह प्रकट नहीं होना चाहिए। आपकी कॉल श्रृंखला कैसी दिखती है? इस तरह: 'FooResource # fetchAll (...) -> FooService # getBar (...) -> FooMapper # findAll (...) '? क्या 'FooMapper # findAll (...)' एक 'FooCollection' वापस करता है? 'findAll ($ params = array()) { \t $ select = $ this-> getSelect(); \t $ चयन-> जहां (...); \t $ पेजिनेटर एडाप्टर = $ यह-> createPaginationAdapter ($ select); \t $ संग्रह = नया FooCollection ($ paginatorAdapter); \t $ संग्रह वापसी; } ' – automatix

उत्तर

4

मुझे नहीं पता कि आप डेटा को कैसे पुनर्प्राप्त कर रहे हैं, लेकिन हालांकि निम्न दृष्टिकोण काम के रूप में काम करता है: कॉल चेन 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 [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 

...