0

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

他们应该在搜索时可以自由使用其中的任何一个或全部。由于这些之间的关系不像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}', 'AdvertController@searchResults');

非常感谢

4

2 回答 2

0

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

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

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

于 2013-07-23T05:56:57.417 回答
0

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

为此,我建议使用策略模式(在此处阅读更多内容)。

我会做这样的事情:

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

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

于 2016-12-03T12:22:34.827 回答