如何在CodeIgniter中跨页面使用户对象可用?

时间:2011-03-15 19:01:28

标签: codeigniter controller authentication ion

我是CodeIgniter的新手,我正在使用Ion Auth进行用户授权。使用Ion Auth库,您将获得一个用户对象,如:

  $user = $this->ion_auth->get_user();
  echo $user->email;

如果用户已登录,我希望$ user对象在任何页面上(在任何控制器中)都可用。我怎样才能做到这一点? (我正在使用CodeIgniter 2)

2 个答案:

答案 0 :(得分:6)

This blog post of mine详细介绍了使用Ion_Auth来让您的整个应用程序(包括视图)访问您当前用户的信息。

简短版本......(特别针对手头的主题)

将其添加到MY_Controller.php文件

class User_Controller extends CI_Controller {

    protected $the_user;

    public function __construct() {

        parent::__construct();

        if($this->ion_auth->logged_in()) {
            $data->the_user = $this->ion_auth->get_user();
            $this->the_user = $data->the_user;
            $this->load->vars($data);
        }
        else {
            redirect('/');
        }
    }
}

然后在您的应用程序中,只需像这样创建您的控制器

class App_Controller extends User_Controller {

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

    function index() {
        //do stuff
    }
}

然后,您不仅可以在控制器中访问$this->the_user,还可以使用$the_user

$this->load->vars()加载到每个视图中

答案 1 :(得分:2)

通常你会在会话中缓存这样的东西,但是我在大多数CI应用程序中已经远离了这个。

示例:您将用户登录(缓存用户数据),然后他们将在他们的个人资料页面上更新他们的电子邮件。您现在必须重新加载缓存。许多其他事情可能会推动重新加载。通常我更多的缓存是ID,然后我做你正在做的事情,并在我需要的任何页面上获取用户的数据。

我发现有一件事有帮助就是拥有base controllers。例如,我有一个RegisteredUserController。任何需要用户登录的操作的控制器都会扩展此操作。这样我可以保持登录检查和诸如将用户数据放在一个位置(在构造函数中)之类的事情。例如:

class RegisteredUserController extends CI_Controller {
    var $user;

    function  __construct()  {
        parent::__construct();
            $this->user = $this->ion_auth->get_user();
        }
}

然后,任何扩展RegisteredUserController而不仅仅是控制器的控制器都可以通过$this->user转到用户。遵循这种模式将在每个页面(扩展控制器)上获得它,而无需借助缓存。