2013-07-23 2 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

심포니 라우팅 구성 요소가 경로를 일치의 REQUEST_URI 서버 변수를 가져, 따라서 Laravel의이 Route 외관 URL 매개 변수를 선택하지 것이다 .

대신 Input::get()을 사용하여 가져 오십시오.

예를 들어 Input::has('class')을 사용하여 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 변수에 처리기를 정의합니다.

전략 패턴에는 많은 이점이 있습니다. 나는 그것을 강력히 추천 할 것이다.