2013-07-01 148 views
4

使用Symfony2,FOSRest和Doctrine構建了一個API。鑑於以下路線:處理查詢字符串?

"GET /api/path/to/product" 

而且以下參數:

[("vendorID", 10), ("destination", "tanzania"), ("type", "accommodation"), ("sort", "price", "ASC")] 

使用FOSRest捆綁其可以檢索這些字符串,但是,它們映射到教義查詢是在挑戰出現。

我想過使用爲查詢字符串的不同組合定製的大量case語句,而不是一個優雅的解決方案。希望構建一個不會嚴重影響性能的更通用的控制器。任何建議都會有幫助。

回答

7

FOSRestBundle有一個很酷的param fetcher listener。有了它,你可以用註釋定義你的查詢字符串參數,允許它們可以爲空或者不設置默認值,定義需求。根據您的參數。例如我猜一些值

/** 
* @QueryParam(name="vendorID", requirements="\d+", strict=true, description="vendor id") 
* @QueryParam(name="destination", nullable=true, description="restrict search to given destination") 
* @QueryParam(name="type", nullable=true, description="restrict search to given type") 
* @QueryParam(name="sort", requirements="(price|foo|bar)", default="price", description="sort search according to price, foo or bar") 
* @QueryParam(name="dir", requirements="(ASC|DESC)", default="ASC", description="sort search ascending or descending") 
*/ 
public function getProducts(ParamFetcher $paramFetcher) 
{ 
    $vendorID = $paramFetcher->get('vendorID'); 
    // and so on 
} 

爲構建查詢生成器,它是非常簡單,它有一個默認值的參數,可以因爲他們永遠不會裝滿一個未定義的值。對於嚴格的參數來說,這也不成問題,因爲嚴格的參數會在缺少或不符合要求時提高400 Bad Request。只有使用可爲空的參數,在將條件添加到查詢生成器之前,您必須先檢查它們是否爲空。

Btw。看看NelmioApiDocBundle,它爲每個動作生成一個很好的文檔@ApiDoc註釋。它還解析參數提取器註釋。非常便利。

+0

這很好,問題來了實例化查詢或應該委託給產品庫類? – keepitdk

+0

編輯我的答案那一刻。您可以將它們全部傳遞到存儲庫函數,並且只有在可以爲空的參數中,您必須先向查詢生成器添加條件之前,先檢查它們是否爲非空值。 –

+0

非常感謝Pazi。將執行並讓你知道。再次感謝 – keepitdk