【问题标题】:Extending the Session Library in Codeigniter 3在 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 错误,上面写着:无法加载请求的类:会话。

标签: php codeigniter codeigniter-3


【解决方案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的会话类。看我的回答:stackoverflow.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。我可以扩展任何其他库没问题,但这个被搞砸了,因为他们把它移到了一个文件夹中
          猜你喜欢
          • 2015-07-07
          • 2017-03-11
          • 1970-01-01
          • 2015-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-24
          相关资源
          最近更新 更多