此幫助程式包提供解析 REST-API 請求的 URL 的功能。
注意:此版本適用於 Laravel 5。
透過運行來安裝包
composer require marcelgwerder/laravel-api-handler
一旦composer完成,將服務提供者新增至app/config/app.php
中的providers
陣列:
MarcelgwerderApiHandlerApiHandlerServiceProvider::class,
現在將ApiHandler
外觀匯入到您的類別中:
use Marcelgwerder ApiHandler Facades ApiHandler ;
或在app.php
中設定別名:
'ApiHandler' => MarcelgwerderApiHandlerFacadesApiHandler::class,
就是這樣!
關係方法現在需要@Relation
註釋來證明它們是關係方法而不是任何其他方法(請參閱問題 #11)。
/**
* @Relation
*/
public function author () {
return $ this -> belongsTo ( ' Author ' );
}
如果將陣列作為第二個參數傳遞給parseSingle
,則現在必須有列/值對。這允許我們傳遞多個條件,例如:
ApiHandler :: parseSingle ( $ books , array ( ' id_origin ' => ' Random Bookstore Ltd ' , ' id ' => 1337 ));
若要覆寫配置,請在應用程式的 config 資料夾中建立一個名為apihandler.php
的檔案。
查看套件來源中的設定檔以查看可用的選項。
url解析目前支援:
支援兩種 api 資源,單一物件和物件集合。
如果您處理代表單一物件的資源(例如/api/books/1
的 GET 請求,請使用parseSingle
方法。
parseSingle($queryBuilder, $identification, [$queryParams]):
id
列或陣列列/值對 ( array('isbn' => '1234')
) 中使用的整數,用作物件的唯一識別碼。 ApiHandler :: parseSingle ( $ book , 1 );
如果您處理代表多個物件的資源(例如/api/books
的 GET 要求,請使用parseMultiple
方法。
parseMultiple($queryBuilder, $fullTextSearchColumns, [$queryParams]):
ApiHandler :: parseMultiple ( $ book , array ( ' title ' , ' isbn ' , ' description ' ));
parseSingle
和parseMultiple
都傳回一個Result
對象,具有以下可用方法:
getBuilder():傳回原始$queryBuilder
及其應用的所有函數。
getResult():傳回Laravel的get()
或first()
函數傳回的結果物件。
getResultOrFail():如果您期望多個對象,則傳回 Laravel 的get()
函數傳回的結果物件;如果您期望單一對象,則傳回firstOrFail()
。
getResponse($resultOrFail = false):傳回一個 Laravel Response
對象,包括正文、標頭和 HTTP 狀態碼。如果$resultOrFail
,則會在內部使用getResultOrFail()
方法而不是getResult()
。
getHeaders():傳回準備好的標頭數組。
getMetaProviders():傳回元提供者物件的陣列。這些物件中的每一個都透過其get()
方法提供特定類型的元資料。
cleanup($cleanup):如果為 true,則產生的陣列將從無意添加的關係中清除。如果將此類關係作為模型存取器中的屬性進行訪問,則可以自動新增此類關係。清理的全域預設值可以使用設定選項cleanup_relations
定義,預設為false
。
ApiHandler :: parseSingle ( $ books , 42 )-> cleanup ( true )-> getResponse ();
除預定義函數_fields
、 _with
、 _sort
、 _limit
、 _offset
、 _config
和_q
之外,每個查詢參數都被解釋為篩選器。在將不用於過濾的其他參數傳遞給parseMultiple
之前,請務必刪除它們。
/api/books?title=The Lord of the Rings
所有篩選器均使用AND
運算子組合。
/api/books?title-lk=The Lord*&created_at-min=2014-03-14 12:55:02
上面的範例將產生以下 SQL,其中:
WHERE ` title ` LIKE " The Lord% " AND ` created_at ` >= " 2014-03-14 12:55:02 "
也可以對一個篩選器使用多個值。多個值以管道|
分隔。多個值用OR
組合,除非有-not
後綴,然後它們用AND
組合。例如所有 id 為 5 或 6 的書:
/api/books?id=5|6
或 id 5 或 6 之外的所有書籍:
/api/books?id-not=5|6
使用-in
後綴也可以達到相同的效果:
/api/books?id-in=5,6
分別為not-in
字尾:
/api/books?id-not-in=5,6
後綴 | 操作員 | 意義 |
---|---|---|
-lk | 喜歡 | 與 SQL LIKE 運算子相同 |
-非-lk | 不喜歡 | 與 SQL NOT LIKE 運算子相同 |
-在 | 在 | 與 SQL IN 運算子相同 |
-不在 | 不在 | 與 SQL NOT IN 運算子相同 |
-分鐘 | >= | 大於或等於 |
-最大限度 | <= | 小於或等於 |
-英石 | < | 小於 |
-gt | > | 大於 |
-不是 | != | 不等於 |
兩種排序方式,升序和降序。應按降序排序的每一列始終以-
開頭。
/api/books?_sort=-title,created_at
支援兩種全文搜尋實作。您可以透過將設定檔中的fulltext
選項變更為default
或native
來選擇使用哪一個。
注意:當使用空_q
參數時,搜尋將始終傳回空結果。
有限的自訂實作(預設)
給定的文字被分割成關鍵字,然後在資料庫中搜尋這些關鍵字。每當其中一個關鍵字存在時,對應的行就會包含在結果集中。
/api/books?_q=The Lord of the Rings
上面的範例傳回其中一列包含關鍵字The
、 Lord
、 of
、 the
、 Rings
之一的每一行。全文搜尋中要考慮的欄位傳遞給parseMultiple
。
本機 MySQL 實現
如果您的 MySQL 版本支援您使用的引擎的全文搜索,您可以在 api 處理程序中使用此高級搜尋。
只需將fulltext
配置選項變更為本native
,並確保傳遞給parseMultiple
欄位上有正確的全文索引。
每個結果還將包含一個_score
列,該列可讓您根據結果與搜尋字詞的匹配程度對結果進行排序。例如
/api/books?_q=The Lord of the Rings&_sort=-_score
您可以透過修改設定檔中的fulltext_score_column
設定來調整此列的名稱。
若要定義結果中資料集的最大數量,請使用_limit
。
/api/books?_limit=50
若要定義結果中資料集的偏移量,請使用_offset
。
/api/books?_offset=20&_limit=50
請注意,為了使用offset
您始終必須指定一個limit
。對於沒有限制的偏移量定義,MySQL 會拋出錯誤。
API 處理程序也支援 Eloquent 關係。因此,如果您想獲取所有書籍及其作者,只需將作者添加到_with
參數即可。
/api/books?_with=author
關係,也可以嵌套:
/api/books?_with=author.awards
要使其正常工作,您必須將@Relation
註釋添加到每個關係方法中,例如:
/**
* @Relation
*/
public function author () {
return $ this -> belongsTo ( ' Author ' );
}
出於安全原因,這是必要的,因此只能使用_with
來呼叫真正的關係方法。
注意:每當您將_fields
與_with
結合使用來限製欄位時。在底層,字段透過關係的主鍵/外鍵進行擴展。 Eloquent 需要連結鍵來取得相關模型。
可以在回應中新增附加資訊。目前有兩種類型的計數可以添加到響應標頭中。
total-count
表示資源的所有元素的計數,或更具體地說,是最初傳遞的查詢建構器實例的計數。 filter-count
也考慮了過濾器。例如,它們可用於實現分頁。
/api/books?id-gt=5&_config=meta-total-count,meta-filter-count
預設情況下,所有元欄位都在回應標頭中提供。使用以下自訂標頭:
配置 | 標頭 |
---|---|
元總計數 | 元總計數 |
元過濾器計數 | 元過濾器計數 |
預設情況下,元資料包含在回應標頭中。如果您希望將所有內容都放在回應正文中,您可以透過在_config
參數中包含response-envelope
或覆蓋套件的預設config.php
來請求所謂的「信封」。
信封具有以下結構:
{
"meta" : {
},
"data" : [
]
}