我已经创建了一个过滤产品列表的过滤方法。这是我的网址:
localhost/myshop/products/filter?category=shirts&color=blue&page=1
但我想以这种方式表现出来:
localhost/myshop/products/shirts/blue/1
我怎样才能实现它?
答案 0 :(得分:0)
假设Products::filter()
负责处理请求,您可以重写方法以接受其签名中的参数。所以,如果当前的逻辑是这样的:
class Products extends CI_Controller
{
public function filter()
{
// Retrieve data from GET params
$page = $this->input->get('page');
$color = $this->input->get('color');
$category = $this->input->get('category');
// Do the filtering with $category, $color and $page...
}
}
您可以简单地重构它以通过网址段接受参数:
public function filter($category, $color, $page)
{
// Do the filtering with $category, $color and $page...
}
有了这个,您当前的网址是:
localhost/myshop/products/filter/shirts/blue/1
我们需要摆脱额外的filter/
,我们已经完成了,对吧?引自docs:
通常,URL字符串与其对应的控制器类/方法之间存在一对一的关系。 URI中的段通常遵循以下模式:
example.com/class/method/param1/param2
但是,在某些情况下,您可能希望重新映射此关系,以便可以调用与该URL对应的其他类/方法。
好的,所以我们需要重新映射当前路线。您有几个选择:
首先,使用新条目更新您的application/config/routes.php
文件:
$route['products/(:any)'] = 'products/filter/$1';
它表示如果网址以products/
开头,请将其重新映射到filter
类的products
方法。
在这里,您可以使用通配符和正则表达式模式更精确地了解您的方法接受的参数类型。
另一个选择是您可能希望在控制器中实现_remap()
方法,以便为您进行路由重映射。
答案 1 :(得分:0)
在routes.php
文件中,您可以编写以下行
$route['products/(:any)/(:any)/(:num)'] = 'products/filter/$1/$2/$3';
其功能将如下所示
public function filter($category, $color, $page)
{
echo $category.'<br>';
echo $color.'<br>';
echo $page.'<br>';
}