如何在 CodeIgniter 的库中使用 session?

Posted

技术标签:

【中文标题】如何在 CodeIgniter 的库中使用 session?【英文标题】:How can I use session in a library in CodeIgniter? 【发布时间】:2012-09-10 02:13:44 【问题描述】:

我想通过在控制器的构造函数中使用我的库来检查用户是否已登录 CodeIgniter。

这是我的图书馆:

class Administrator_libs 

    public function validate_authen()
        if( $this->session->userdata('user_authen') )
            redirect(base_url().'admin/login/');
           
    

这是我的控制器:

class Administrator extends CI_Controller 

    public function __construct()
        parent::__construct();
        $this->load->library('administrator_libs');
        $this->administrator_libs->validate_authen();
        $this->load->model('mod_menu');
    

但我收到此错误消息:

Undefined property: Administrator_libs::$session

【问题讨论】:

【参考方案1】:

如果您想访问自己内部的任何 CodeIgniter 库,您必须调用 get_instance()。这是因为$this 绑定到您当前的库而不是 CodeIgniter 对象。

$CI =& get_instance();
if( $CI->session->userdata('user_authen') )
    redirect(base_url().'admin/login/');

请参阅Creating Libraries CodeIgniter 文档。特别是在您的库中使用 CodeIgniter 资源

下的内容

这假设您在config/autoload.php 中自动加载会话库,如果没有,您还需要在$CI 实例化之后添加$CI->load->library("session");

重要提示: =& 不是错字。它通过引用传递以节省内存。

【讨论】:

【参考方案2】:

您应该简单地转到 application/autoload.php 并添加您的自动加载包,它应该看起来像这样:$autoload['packages'] = array('database','form_validation','session','email');

您可以看到我在我的包中添加了会话包。现在来到你的构造函数,你应该通过添加这个来加载这个包:$this->load->library("session");

【讨论】:

Jordan's answer 在 2012 年也提到了 autoload CI 功能,但您仍然需要 $CI =& get_instance() 才能在另一个库中访问该库。【参考方案3】:

Session 和任何其他 lib / helper 等扩展来自 CI_Controller / CI_Model / etc... 如果您尝试在不从任何此 CI 模块扩展的库上使用 $this->whatever,您将收到错误消息。 正如 Jordan 所说,您可以使用 get_instance。

【讨论】:

以上是关于如何在 CodeIgniter 的库中使用 session?的主要内容,如果未能解决你的问题,请参考以下文章

使用Amazon SES的Codeigniter SMTP电子邮件

Visual Studio 2013 - 如何在我自己的库中链接/包含其他库

如何在你的库中使用 Spring-Data 以及如何在你的项目中使用这个库?

如何在像犰狳这样的库中扩展一个类?

如何将库集成到我的库中

如何向用户显示会话过期消息(CodeIgniter 框架)?