2014-11-13 28 views
0

我正在使用CodeIgniter編寫網站的後端。我想要能夠使用這兩個網址: (1)website.com/product(返回所有產品的數據) (2)website.com/product/2(返回產品數據,例如ID 2) 。Codeigniter _remap函數將其自己的默認值設置爲字符串「index」

我有一個產品控制器,這裏是大綱的相關代碼:

class Product extends CI_Controller 

public function _remap($id = -1) 
{ 
    $this->my_function($id) 
} 

public function my_function($n) 
{ 
    if ($n == -1) 
    { 
     // Code to return data on all products 
    } 
    else 
    { 
     // Code to return specific product data 
    } 
} 

我使用_remap()原因無它,當URL的形式website.com/product/id,笨的會想要將id解釋爲一種方法。如果URL只是website.com/product,那麼$ id變量被設置爲默認值-1。但奇怪的是,這並沒有發生:相反$ id被設置爲字符串「index」(我通過在_remap()函數中添加var_dump($id);來檢查這一點)。

這是怎麼回事?

+0

我可以只要將if子句更改爲'if($ n ==「index」)',但我想知道發生了什麼。 – Bill

回答

0

我會刪除_remap函數。

class Product extends CI_Controller { 

function __construct(){ 
    parent::__construct(); 
} 

public function index($id = -1) 
{ 
    if($id == -1) 
    { 
     echo 'full list'; 
    } 
    else 
    { 
     echo 'work on id' . $id; 
    } 
} 

} 

然後在config/routes.php

$route['product/(:num)'] = 'product/index/$1'; 

創建一個路由如果你真的想使用_remap,那麼你就需要做類似如下:

public function _remap($method, $params = array()) 
{ 
    if($method == 'index'){ 
     return call_user_func_array(array($this, 'my_function'), $params); 
    } 
} 
+0

我不願意這樣做,因爲我在原始問題中提出的內容實際上是一種簡化。這些網址實際上是形式爲website.com/television/2或website.com/computer等,電視,計算機等是擴展產品的控制器。所以我必須爲所有這些控制器添加新的路由規則(還有其他控制器不會擴展產品,所以我不能只執行'$ route ['(:any)/(:num)']' )。我可以做到,但我真的很想了解remap()的奇怪行爲。 – Bill

+0

'_remap()'第一個參數總是控制器要調用的方法。在你的情況下,它是索引,因爲這是CI可以調用的默認方法。函數不能以數字開頭。我將更新我的_remap方法,以便您可以看到如何將它用於參數。 – Overachiever

+0

我想我明白了:'_remap()'被設計爲將方法作爲參數,因此它堅持默認參數應該是「index」,因爲這是codeigniter控制器的默認參數。 – Bill

相關問題