2013-07-23 45 views
0

我正在使用Laravel。我希望用戶能夠使用最多3個標準在我的網站上執行搜索。這些標準是:班級,品牌和型號。如何在Laravel中定義具有多個參數而沒有漂亮URL的路由

他們應該可以自由地使用任何或全部搜索時。由於它們之間的關係並不像Many-> 1,Many-> 1,Many-> 1那樣簡單,並且也給出了條件,所以如果空白,我將不會使用漂亮的URL來發布搜索條件爲他們會看起來像這樣:

/SearchResults/0/BMW/0 

這對用戶和搜索引擎沒有意義。因此,我想正常使用動態地址這條路線如下:

/SearchResults/?Class=0&Brand="BMW"&Model=0 

如何定義,讓我來提取這三個標準,並把它傳遞給我的資源控制的自定義方法的路線?

我都試過,但它不是工作:

Route::get('/SearchResults/?Class={$class}&Brand={$brand}&Model={$type}', '[email protected]'); 

非常感謝

回答

0

symfony的路由組件獲取REQUEST_URI服務器變量匹配路線,從而Laravel的Route門面不接URL參數。使用Input::get()來取回它們。

例如,您將首先檢查class參數是否存在,方法是使用Input::has('class'),然後使用Input::get('class')獲取該參數。一旦你擁有了全部三個或者其中一部分,你就可以開始你的模型/ SQL查詢,這樣你就可以將結果返回給用戶。

+0

這很有道理 - 我很高興以這種方式檢索參數,但我仍然需要路由到正確的類方法 - 如何忽略參數而做到這一點? –

+0

如果我正確理解你,你只需要將'SearchResults'路由映射到'AdvertController @ SearchResults'方法。無論如何,參數將在那裏可用... –

0

您需要將所有路由路由到同一個方法,然後在控制器內將給定的操作重新路由到控制器內的正確方法。

爲此,我建議使用策略模式(read more here)。

我會做這樣的事情:

route.php

Route::get('/SearchResults', '[email protected]'); 

AdvertController.php

use Input; 
... 
private $strategy = []; 
public function __construct(){ 
    $strategy = [ 
     /*class => handler*/ 
     '0'=> $this->class0Handler, 
     '1'=>$this->class1Handler, 
     ...]; 
} 
private function class0Handler(){ 
    //your handler method 
} 
public function searchResults(){ 
    if(!array_key_exists(Input::get('class'),$this->strategy)) 
     abort(404); 
    return $this->strategy[Input::get('class')](); 
} 

如果你是其他類型的打破搜索,您在$strategy變量中定義處理程序。

戰略模式有很多好處。我會強烈推薦它。

相關問題