当用户登录后,我希望他们能够访问http://website.com/user
并转到http://website.com/1/johndoe
,其中1
是其用户ID,{{1}是他们的用户名。
我正在尝试使用johndoe
来捕获_remap()
的所有尝试,因此即使不完整的URI(如http://website.com/user/
或http://website.com/user/1
)也会重定向到http://website.com/user/1/joh
。
这是我尝试过的:
http://website.com/user/1/johndoe
我当然可以首先检测方法,然后执行以下操作:
class User extends CI_Controller {
function index($uID, $user) {
echo $uID;
echo $user;
}
function _remap() {
$uID = 3;
$user = 'johndoe';
//redirect('user/'.$uID.'/'.$user); // Updates URI, but redirect loop
//$this->index($uID, $user); Works, but doesn't update the URI
}
}
但是我认为URI看起来像function _remap($method = '') {
if ($method != 'view') {
$uID = 3;
$user = 'johndoe';
redirect('user/view/'.$uID.'/'.$user);
}
}
function view($uID, $user) {
echo $uID;
echo $user;
}
,而我宁愿http://website.com/user/view/1/johndoe
被排除在外。我应该怎么解决这个问题?
答案 0 :(得分:0)
我使用的解决方案是:
$route['user/(:num)/:any'] = 'user/view/$1';
$route['user/(:num)'] = 'user/view/$1';
实际上,用户名应仅用于搜索引擎优化目的,在这种情况下,不应传递给操作。当然,当你查找用户时,你将能够从UserID访问用户名,所以我觉得它是多余的。
以上将匹配
/user/1/jdoe
/user/1
但只会将1
传递给您的user/view
操作。
编辑:记住您的评论:
$route['user/(:num)/(:any)'] = 'user/view/$1/$2';
$route['user/(:num)'] = 'user/view/$1';
function view($UserID, $UserName = null) {
// Load the model and get the user.
$this->model->load('user_model');
$User = $this->user_model->GetByUserID($UserID);
// If the user does not exist, 404!
if (empty($User)) {
show_404();
return;
}
// If the UserName does not exist, or is wrong,
// redirect to the correct page.
if($UserName === null || strtolower($User->UserName) != strtolower($UserName)) {
redirect("user/$UserID/{$User->UserName}");
return;
}
}
以上将接受用户名作为参数,但如果未提供或不正确,则会重定向到正确的网址并继续。
希望这可以解决您的问题?
答案 1 :(得分:0)
如果您使用_remap()
方法 - 它将始终被调用,因此重定向到 user / anything 仍将在下一个请求中调用_remap()
,因此不仅你需要捕获路由器方法和它的参数 - 如果你想以一种有意义的方式使用_remap()
,你必须这样做:
public function _remap($method, $args)
{
if ($method === 'user' && (empty($args) OR ! ctype_digit($args[0])))
{
// determine and handle the user ID and name here
}
else
{
return call_user_func_array(array($this, $method), $args));
}
}