如何在Laravel中使用多个参数定义没有漂亮网址的路由

时间:2013-07-23 04:25:52

标签: php laravel routes dynamic-url

我正在使用Laravel。我希望用户能够使用最多3个条件在我的网站上执行搜索。这些标准是:类,品牌和模型。

搜索时,他们应该可以自由使用其中的任何一个或全部。由于这些之间的关系并不像Many-> 1,Many-> 1,Many-> 1那样简单,并且如果空白,也会给出标准,我不想使用漂亮的网址发布搜索条件如下所示:

/SearchResults/0/BMW/0

这对用户和搜索引擎毫无意义。因此,我想对此路由使用常规动态地址,如下所示:

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

如何定义允许我提取这三个条件并将其传递给资源控制器中的自定义方法的路由?

我试过这个,但它不起作用:

Route::get('/SearchResults/?Class={$class}&Brand={$brand}&Model={$type}', 'AdvertController@searchResults');

非常感谢

2 个答案:

答案 0 :(得分:0)

Symfony Routing组件获取REQUEST_URI服务器变量以匹配路由,因此Laravel的Route Facade不会获取URL参数。

相反,请使用Input::get()来获取它们。

例如,您首先要使用class检查Input::has('class')参数是否存在,然后使用Input::get('class')获取它。一旦你拥有了这三个,或者只是其中的一部分,你就可以启动模型/ SQL查询,以便将结果返回给用户。

答案 1 :(得分:0)

您需要将所有方法路由到同一方法,然后在控制器内将该给定操作重新路由到控制器内的正确方法。

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

我会做这样的事情:

<强> route.php

Route::get('/SearchResults', 'AdvertController@searchResults');

<强> 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变量中定义处理程序。

战略模式有很多好处。我强烈推荐它。