运行_remap()一次

时间:2012-11-21 09:17:50

标签: php codeigniter

当用户登录后,我希望他们能够访问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被排除在外。我应该怎么解决这个问题?

2 个答案:

答案 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));
    }
}