2016-11-29 179 views
-1

我已经创建了用于过滤产品列表的过滤器方法。这是我的网址:CodeIgniter中的Seo友好URL

localhost/myshop/products/filter?category=shirts&color=blue&page=1 

但是我想表明这样说:

localhost/myshop/products/shirts/blue/1 

我怎样才能实现呢?

+0

第一个URL中的控制器名称是什么? – Tpojka

+0

请提供您尝试过的代码,以便其他人可以帮助您。 –

+0

对不起,我忘记了。它是产品。 – kate23

回答

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... 
    } 
} 

你可以简单地重构它接受通过URL分段参数:

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

在一些情况下,但是,可能要重新映射该关系,以使不同类/方法可以代替被称为对应于所述一个的网址。

好的,所以我们需要重新映射当前路由。您有几种选择:

  • 首先,是一个新的条目更新您的application/config/routes.php文件:

    $route['products/(:any)'] = 'products/filter/$1'; 
    

    它说,如果一个URL以products/启动时,它重新映射到的filter方法products类。

    在这里,您可以使用通配符和正则表达式来更精确地说明您的方法接受的参数类型。

  • 另一种选择是,您可能想在控制器中实施_remap()方法,以便为您执行路线重映射。

+0

真棒!这是完美的!!谢谢,但如果其中一个参数是空的,怎么能避免?例如:localhost/myshop/products/filter/blue/1 – kate23

+0

没关系。如果其中一个或多个参数为空,CodeIgniter将为您的引发一个'ArgumentCountError'异常。如果其中一个或多个参数包含非法字符,您将收到一个'400 Bad Request'。所以,基本上,您可以安全抵御这些威胁。 – sepehr

+0

即使在'routes.php'文件中,您也可以指定通配符/正则表达式模式来匹配和保护参数。举个例子,你想'$ page'总是一个数字:'$ route ['products /(:any)/(:any)/(:num)'] ='products/filter/$ 1/$ 2/$ 3' ;'。在[路由文档](https://www.codeigniter.com/userguide3/general/routing.html)中阅读更多关于此的信息。 – sepehr