2012-12-08 44 views
0

我喜欢SO处理URI的方式。我想在CI中模仿相同的行为。我有一个名为Users的控制器,索引方法应该有一个参数,即用户标识。我在数据库中搜索与该用户标识关联的用户名。考虑到user:1username:Santa Claus,我怎么能在用户名追加到URI,所以它看起来像http://foo.com/users/1/santa-claus附加URI段

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class Users extends CI_Controller { 

function index($uID = 0) { 
    if ($uID > 0) { 
     $this->load->model('users_model'); 
     $uname = $this->users_model->_getUsername($uID); 

     #append somehow..  

    } else { 
     echo('load all users'); 
    } 
} 

} 

只是要清楚,我试图做到这一点:

https://stackoverflow.com/a/11041075/704015

回答

1

的application/config/routes.php文件

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

控制器

function index($uID = 0) { 
     ..... 
     $uname = strtolower(str_replace(" ", "-", $uname)); 

     header("Location: ".base_url()."user/".$uID."/".$uname); 

请包括一个条件做别的事情柜面用户名已经存在,以避免循环。

+0

您正确地预测到它会导致重定向循环。我的第一个想法是分解URI并检查最后一个段的值与'$ uname'的值,但我不知道这有多可靠。 –

+0

我加了这个条件:'$ uri = explode('/',$ _SERVER ['REQUEST_URI']); \t \t \t if($ uname!= end($ uri)){...} –

0

这在你的config/routes.php文件

$route['users/(:num)/(:any)'] = 'users/$1/$2'; 

,这在您的控制器

public function users($id,$username = FALSE) 
{ 
+0

这不起作用。我不知道为什么这也会起作用。如果我访问了方法但没有包含第二个参数,它将如何在数据库中搜索与用户ID关联的用户名,并将用户名附加到URI? –

+0

很简单,你真的可以追加通过javascript检索到的信息(所以你不必重做) 像这样: window.history.pushState(“object or string”,“Title”,“/ new-url “); 此处更多详细信息 http://stackoverflow.com/questions/3338642/updating-address-bar-with-new-url-without-hash-or-reloading-the-page?answertab=oldest#tab-top – xdotcommer

+0

理想情况下,我会在不依赖JS的情况下创建所有重要的功能。 –