getList(...); * foreach ($pagedListResponse as $element) { * // doSomethingWith($element); * } * ``` * * Example of iterating over each page of elements: * ``` * $pagedListResponse = $client->getList(...); * foreach ($pagedListResponse->iteratePages() as $page) { * foreach ($page as $element) { * // doSomethingWith($element); * } * } * ``` * * Example of accessing the current page, and manually iterating * over pages: * ``` * $pagedListResponse = $client->getList(...); * $page = $pagedListResponse->getPage(); * // doSomethingWith($page); * while ($page->hasNextPage()) { * $page = $page->getNextPage(); * // doSomethingWith($page); * } * ``` */ class PagedListResponse implements IteratorAggregate { private $firstPage; /** * PagedListResponse constructor. * * @param Page $firstPage A page containing response details. */ public function __construct( Page $firstPage ) { $this->firstPage = $firstPage; } /** * Returns an iterator over the full list of elements. If the * API response contains a (non-empty) next page token, then * the PagedListResponse object will make calls to the underlying * API to retrieve additional elements as required. * * NOTE: The result of this method is the same as getIterator(). * Prefer using getIterator(), or iterate directly on the * PagedListResponse object. * * @return Generator * @throws ValidationException */ public function iterateAllElements() { return $this->getIterator(); } /** * Returns an iterator over the full list of elements. If the * API response contains a (non-empty) next page token, then * the PagedListResponse object will make calls to the underlying * API to retrieve additional elements as required. * * @return Generator * @throws ValidationException */ #[\ReturnTypeWillChange] public function getIterator() { foreach ($this->iteratePages() as $page) { foreach ($page as $key => $element) { yield $key => $element; } } } /** * Return the current page of results. * * @return Page */ public function getPage() { return $this->firstPage; } /** * Returns an iterator over pages of results. The pages are * retrieved lazily from the underlying API. * * @return Page[] * @throws ValidationException */ public function iteratePages() { return $this->getPage()->iteratePages(); } /** * Returns a collection of elements with a fixed size set by * the collectionSize parameter. The collection will only contain * fewer than collectionSize elements if there are no more * pages to be retrieved from the server. * * NOTE: it is an error to call this method if an optional parameter * to set the page size is not supported or has not been set in the * original API call. It is also an error if the collectionSize parameter * is less than the page size that has been set. * * @param int $collectionSize * @throws ValidationException if a FixedSizeCollection of the specified size cannot be constructed * @return FixedSizeCollection */ public function expandToFixedSizeCollection(int $collectionSize) { return $this->getPage()->expandToFixedSizeCollection($collectionSize); } /** * Returns an iterator over fixed size collections of results. * The collections are retrieved lazily from the underlying API. * * Each collection will have collectionSize elements, with the * exception of the final collection which may contain fewer * elements. * * NOTE: it is an error to call this method if an optional parameter * to set the page size is not supported or has not been set in the * original API call. It is also an error if the collectionSize parameter * is less than the page size that has been set. * * @param int $collectionSize * @throws ValidationException if a FixedSizeCollection of the specified size cannot be constructed * @return Generator|FixedSizeCollection[] */ public function iterateFixedSizeCollections(int $collectionSize) { return $this->expandToFixedSizeCollection($collectionSize)->iterateCollections(); } }