在 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->load->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
通常被触发有两个原因。
另外,请确保您的 config.php
上有一个加密密钥
$config['encryption_key'] = 'xxxxxxxxxxxxxxxxxxxxxxx';
【讨论】:
我已经有了这个。这行不通。我在最初的问题中提到了这一点。 是的。我有所有这些。我仍然得到同样的错误。你会把 MY_Session.php 放在哪里?我在应用程序/库文件夹中有它 @luv2Code,那将是正确的地方。你是linux系统的吗? 是的 Linux。我可以扩展任何其他库没问题,但这个被搞砸了,因为他们把它移到了一个文件夹中以上是关于在 Codeigniter 3 中扩展会话库的主要内容,如果未能解决你的问题,请参考以下文章
即使未加载 codeigniter 会话库,也会在数据库中创建新的会话条目。为啥?