Расширение библиотеки сеансов в Codeigniter 3

Я уже давно использую CI и недавно обновился до CI 3. Я заметил, что библиотека сеансов теперь перемещена в папку. Раньше у меня был собственный файл MY_Session.php в папке application/libraries, который расширял библиотеку CI по умолчанию.

Я также использую файл autoload.php для автоматической загрузки моей библиотеки сеансов. Это больше не работает, так как я получаю Невозможно загрузить запрошенный класс: Session.

Если я удалю файл MY_Session.php, страницы загрузятся, но тогда мне не хватит расширенных функций.

Кто-нибудь знает, как именно расширить библиотеку сеансов в CI 3?


person luv2Code    schedule 09.11.2012    source источник
comment
Можете ли вы уточнить, что вы подразумеваете под CodeIgniter 3? На их сайте указано, что последняя версия 2.1.3.   -  person Darrrrrren    schedule 09.11.2012
comment
ночная сборка, или реактор CodeIgniter, как они его называют. https://github.com/EllisLab/CodeIgniter   -  person luv2Code    schedule 09.11.2012
comment
Вы получаете какие-либо ошибки? Это может помочь нам выявить проблему.   -  person Starx    schedule 09.11.2012
comment
да. Я получаю обычную ошибку CI, которая гласит: «Невозможно загрузить запрошенный класс: Session.   -  person luv2Code    schedule 09.11.2012


Ответы (6)


В настоящее время это невозможно сделать, но существует ожидающий запрос на включение, который пытается решить проблему проблема.

Однако вы не должны публиковать вопросы, связанные с еще не выпущенным программным обеспечением. Все, что находится в стадии разработки, может снова измениться, устареть и т. д., и ваш вопрос автоматически станет неактуальным для всех, включая вас самих. Вы должны публиковать/задавать свои вопросы в самом репозитории (и, конечно же, искать уже существующую проблему).

person Narf    schedule 14.11.2012
comment
Класс сеанса CodeIgniter 3 можно расширить. См. мой ответ: " title="расширение библиотеки сеансов в codeigniter 3"> stackoverflow.com/questions/13300283/ - person c.hill; 19.02.2013
comment
@c.hill Это было невозможно в то время, когда был задан вопрос (и когда я ответил на него). В конце концов (и как я уже заметил), CodeIgniter 3 все еще находится в разработке. - person Narf; 20.02.2013

Для полноты картины, поскольку версия 3.0 уже давно выпущена: если вы хотите расширить класс Session, вам нужно добавить свой расширенный класс MY_Session.php в каталог application/libraries/Session, чтобы имитировать его system/libraries/Session/Session. аналог php.

После того, как у вас будет правильная структура каталогов, ваш файл MY_Session.php должен содержать обычный способ расширения классов системной библиотеки, как отметил @Starx.

person Mirkules    schedule 16.09.2015

Возможно расширить класс Session в CodeIgniter 3. По общему признанию, это немного глупо, но я все равно использую это только для исправления давней ошибки в классе Session. Вот пример библиотеки MY_Session.php для CI3:

<?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

Раскрытие информации: это мой личный блог.

person c.hill    schedule 19.02.2013

Мне удалось расширить CI_Session в Codeigniter 3.1.3. Вот что я сделал:

Создайте файл 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['библиотеки'] = массив('сеанс',....)

person Shemeshey    schedule 20.02.2017

Вы можете сделать это аналогично расширению других основных компонентов.

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';
person Starx    schedule 09.11.2012
comment
У меня это уже было. Это не работает. Я упомянул об этом в исходном вопросе. - person luv2Code; 09.11.2012
comment
да. У меня все это на месте. Я все еще получаю ту же ошибку. Куда бы вы поместили MY_Session.php? У меня он лежит в папке application/libraries - person luv2Code; 09.11.2012
comment
@ luv2Code, это было бы подходящим местом для этого. Вы в системе Linux? - person Starx; 09.11.2012
comment
да линукс. Я могу расширить любую другую библиотеку без проблем, но эта испорчена, потому что они переместили ее в папку - person luv2Code; 09.11.2012

Надеюсь, еще не поздно:

Когда вы загружаете (или автоматически загружаете) библиотеку сеансов, теперь вы должны загружать ее как драйвер, а не как библиотеку. Это означает вызов

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

вместо

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

и/или перечисление «сеанса» в

$autoload['drivers']

вместо

$autoload['libraries']

person Chiribuc    schedule 25.11.2013