5

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

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

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

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

4

6 回答 6

13

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

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

于 2015-09-16T05:23:57.517 回答
5

目前不可能做到这一点,但有一个挂起的拉取请求试图解决这个问题。

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

于 2012-11-14T20:36:13.027 回答
2

可以在 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

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

于 2013-02-19T19:01:58.623 回答
2

我设法在 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',....)

于 2017-02-20T20:25:23.640 回答
0

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

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';
于 2012-11-09T00:28:58.590 回答
-1

我希望不会迟到:

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

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

代替

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

和/或在

$autoload['drivers']

代替

$autoload['libraries']

于 2013-11-25T21:56:39.277 回答