2016-02-09 19 views
2

此問題在一段時間內會對我產生影響。爲了測試它,我只安裝了一個新的Apigility,設置了db(PDO:mysql)並添加了一個DB-Connected服務。在表格中,我有40多條記錄。當我進行GET收集請求時,響應看起來很好(使用默認的HAL內容協商)。然後我將內容協商更改爲JSON。現在,當我進行GET收集請求時,我的響應僅包含10個元素。當內容協商設置爲JSON時,Apigility GET集合僅返回10個結果

所以我的問題是:我在哪裏設置/更改此限制?

+0

您是否在某處設置了頁面大小參數? – Wilt

+0

@Well嗯......我認爲它以某種方式強制HAL設置的頁面大小,但默認設置爲25。試圖改變,但沒有改變結果,只有10個結果顯示無論頁面大小設置爲。 – Zsolt

+0

我遇到了同樣的問題。你會認爲簡單的JSON默認值是無限的結果,但也許他們擔心無限的查詢會破壞你的性能。我可能不得不轉而使用HalJSON選項。 –

回答

0

請問您可以發送json輸出結尾處的page_size,total_items部分嗎?

是這樣的:

"page_count": 140002, 
"page_size": 25, 
"total_items": 3500035, 
"page": 1 
+0

僅當內容協商設置爲HAL(然後顯示正確的數據)時纔會包含此選項。但是,正如我在問題中指出的那樣,內容協商設置爲JSON,因此僅包含JSON中包含的實際響應數據。問題在於這個響應只包含10個元素,儘管沒有設置任何限制,至少不是由我設置的。 – Zsolt

1

您可以手動設置頁面大小,就像這樣:

$paginator = $this->getAlbumTable()->fetchAll(true); 

// set the current page to what has been passed in query string, or to 1 if none set 
$paginator->setCurrentPageNumber((int) $this->params()->fromQuery('page', 1)); 

// set the number of items per page to 10 
$paginator->setItemCountPerPage(10); 

http://framework.zend.com/manual/current/en/tutorials/tutorial.pagination.html

+0

請用英文發帖。 – Tunaki

+0

問題是如何在使用DB連接接口時設置(或取消限制)。關於這個設置的好處是你不必編寫任何自定義代碼。您可以通過Apigility UI完成所有操作。對於快速原型項目等非常有用,但10個結果的限制不必要地妨礙了原型設計。 –

0

這不是一個理想的修復,因爲它需要你去轉換爲源代碼而不是使用UI中給出的頁面大小。

DB連接風格爲您自動生成的集合類派生自Zend/Paginator/Paginator。這個類定義了默認爲10的$ defaultItemCountPerPage靜態保護成員,這就是爲什麼你只能得到10個結果。如果您爲實體打開自動生成的集合類,並在其他空類中添加:protected static $defaultItemCountPerPage = 100;,則您會看到現在在響應中最多可獲得100個結果。您可以查看其他Paginator類變量和您可以在派生類中替換的方法,以獲得所需的行爲。

這不是一個理想的解決方案。我更喜歡生成的代碼自動使用HalJson策略使用的相同頁面大小。也許我會貢獻一個公關來改變這一點。或者,也許我只會使用HalJson方法。這似乎是更好的方式去。您應該對從數據庫中一次加載多少數據有一定限制,以避免運行過長的查詢或需要處理的過多數據集合返回。而且,無論你設定了什麼限制,當你達到這個限制時你做了什麼?使用簡單的Json方法,您無法獲得數據的「第2頁」。因此,如果您要處理大量的數據,最好使用HalJson,然後在客戶端有一些邏輯來根據需要一次抓取數據頁面。返回的JSON結構稍微複雜一些,但並不是如此。

我可能與你在同一地點 - 我試圖做一個簡單的小api玩,同時保持一切簡單,所以我不希望客戶端必須處理其他東西在HalJson中,但可能更好地處理這種複雜性,並有一個平滑的方式來瀏覽數據,如果你要使用一些真實的數據集。至少,這就是我現在正在給自己的最好的演講。 :-)