0

当用户登录时,我希望他们能够访问http://website.com/user并被带到http://website.com/1/johndoe1他们的用户 ID 和johndoe用户名在哪里。

我正在尝试使用_remap()来捕获所有尝试http://website.com/user/,因此即使是不完整的 URI,例如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
    }

}

我当然可以先检测该方法,然后执行以下操作:

function _remap($method = '') {
    if ($method != 'view') {
        $uID = 3;
        $user = 'johndoe';
        redirect('user/view/'.$uID.'/'.$user);
    }
}

function view($uID, $user) {
    echo $uID;
    echo $user;
}

但后来我认为 URI 看起来像http://website.com/user/view/1/johndoe,我宁愿view被排除在外。我该如何解决这个问题?

4

2 回答 2

0

如果你有一个_remap()方法——它总是会被调用,所以重定向到用户/任何东西仍然会_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));
    }
}
于 2012-11-21T14:44:56.990 回答
0

我使用的解决方案是:

$route['user/(:num)/:any'] = 'user/view/$1';
$route['user/(:num)'] = 'user/view/$1';

确实,用户名应该只用于 SEO 目的,在这种情况下,不应将其传递给操作。无论如何,当您查找用户时,您当然可以从 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;
    }
}

以上将接受用户名作为参数,但是如果未提供或不正确,它将重定向到正确的 url 并继续。

希望这可以解决您的问题?

于 2012-11-21T14:42:44.723 回答