在 Codeigniter 3 中扩展会话库

Posted

技术标签:

【中文标题】在 Codeigniter 3 中扩展会话库【英文标题】:Extending the Session Library in Codeigniter 3 【发布时间】:2012-10-29 07:30:51 【问题描述】:

我使用 CI 已经有一段时间了,最​​近升级到 CI 3。我注意到 Session 库现在已移动到一个文件夹中。 我曾经在扩展默认 CI 库的 application/libraries 文件夹中有自己的 MY_Session.php 文件。

我还使用 autoload.php 文件来自动加载我的会话库。 这不再有效,因为我无法加载请求的类:会话。

如果我删除 MY_Session.php 文件,则页面会加载,但我会丢失我的扩展功能。

有人知道如何在 CI 3 中扩展会话库吗?

【问题讨论】:

你能澄清一下你所说的 CodeIgniter 3 是什么意思吗?他们的网站声明最新版本是2.1.3 夜间构建,或 CodeIgniter 反应器,正如他们所指的那样。 https://github.com/EllisLab/CodeIgniter 您收到任何错误吗?这可以帮助我们确定问题。 是的。我收到通常的 CI 错误,上面写着:无法加载请求的类:会话。 【参考方案1】:

我设法在 Codeigniter 3.1.3 中扩展了 CI_Session。这是我所做的:

创建文件application/libraries/Session/MY_Session.php

<?php                                                                                                                                                                                           
defined('BASEPATH') OR exit('No direct script access allowed');

class MY_Session extends CI_Session 

    public function __construct(array $params = array())
       
        if ( $this->ignore_sessions() )
            return;
        parent::__construct();
       

    function ignore_sessions()
       
        $uri = str_replace ("//", "/", $_SERVER['REQUEST_URI']);
        if ( strpos($uri, '/ignore_this_controller/') === 0 ) 
            return true;
        return false;
       
  

您可能还想在 config/autoload.php 中添加“会话”:

$autoload['libraries'] = array('session',....)

【讨论】:

【参考方案2】:

为了完整起见,因为 3.0 早就发布了:如果你想扩展 Session 类,你需要将你的扩展类 MY_Session.php 添加到 application/libraries/Session 目录以模仿它的 system/libraries/Session /Session.php 对应。

在您拥有正确的目录结构后,您的 MY_Session.php 文件应该包含扩展系统库类的常用方法,正如@Starx 所指出的那样。

【讨论】:

【参考方案3】:

希望不要迟到:

当您加载(或自动加载)会话库时,您现在必须将其加载为驱动程序而不是库。这意味着调用

$this->load->driver('session') 

而不是

$this-&gt;load-&gt;library('session')

和/或在

中列出“会话”

$autoload['drivers']

而不是

$autoload['libraries']

【讨论】:

【参考方案4】:

可以在 CodeIgniter 3 中扩展 Session 类。诚然,这有点麻烦,但无论如何我只是用它来修复 Session 类中长期存在的错误。这是 CI3 的示例 MY_Session.php 库:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

require_once SYSDIR . '/libraries/Driver.php';
require_once SYSDIR . '/libraries/Session/Session.php';

/*
    Change the following if you want to use a different driver.
*/
require_once SYSDIR . '/libraries/Session/drivers/Session_cookie.php';

class MY_Session extends CI_Session_cookie


    function __construct()
    
        parent::__construct();
    

    protected function _sess_update($force = false)
    
        // Do NOT update an existing session on AJAX calls.
        if ($force || !$this->CI->input->is_ajax_request())
            return parent::_sess_update($force);
    



/* End of file MY_Session.php */
/* Location: ./application/libraries/MY_Session.php */

如需了解更多信息,或者如果它发生变化,请继续关注: http://degreesofzero.com/article/55

披露:这是我的个人博客。

【讨论】:

【参考方案5】:

目前不可能做到这一点,但有一个pending pull request 试图解决这个问题。

但是,您不应发布与尚未发布的软件相关的问题。任何处于开发 阶段的东西都可能再次更改、过时等等,而您在这里的问题将自动变得与所有人无关,包括您自己。您应该在存储库本身上发布/询问您的问题(当然还要搜索已经存在的问题)。

【讨论】:

可以扩展CodeIgniter 3的会话类。看我的回答:***.com/questions/13300283/… @c.hill 在提出问题时(以及当我回答问题时)是不可能的。毕竟(正如我所指出的),CodeIgniter 3 仍在开发中。【参考方案6】:

您可以像扩展其他核心组件一样执行此操作。

class MY_Session extends CI_Session 

    function __construct() 
    
        parent::__construct();
        echo "In extended the session";
    
  

确保您也加载了会话库。喜欢

$autoload['libraries'] = array('database','session');

另外,Unable to load the requested class: Session 通常被触发有两个原因。

CI 无法处理会话 您尚未自动加载库

另外,请确保您的 config.php 上有一个加密密钥

$config['encryption_key'] = 'xxxxxxxxxxxxxxxxxxxxxxx';

【讨论】:

我已经有了这个。这行不通。我在最初的问题中提到了这一点。 是的。我有所有这些。我仍然得到同样的错误。你会把 MY_Session.php 放在哪里?我在应用程序/库文件夹中有它 @luv2Code,那将是正确的地方。你是linux系统的吗? 是的 Linux。我可以扩展任何其他库没问题,但这个被搞砸了,因为他们把它移到了一个文件夹中

以上是关于在 Codeigniter 3 中扩展会话库的主要内容,如果未能解决你的问题,请参考以下文章

我应该在 CodeIgniter 中使用哪个会话库?

Codeigniter 3 - 会话不工作

即使未加载 codeigniter 会话库,也会在数据库中创建新的会话条目。为啥?

CodeIgniter 2.1.0 的会话库中是不是有任何已知的错误?为啥我会被踢出去? [关闭]

Codeigniter 会话库错误

Codeigniter 3 - 从外部 Codeigniter 安装访问会话