Как получить данные с крючка в Codeigniter?

Я использую hook механизм в кодеигниторе. Вид крючка post_controller_constructor,

Внутри класса есть один закрытый объект:

private $settings = array();

Этот объект заполняется после выполнения хука. Как я могу получить доступ к $settings из библиотек CI и контроллеров?

Учебный класс:

<? class LCode_module
{
    private $CI;
    private $_default_lang = "en";
    private $_sufixLangDefault = "_EN";
    private $allowedLanguages = array();

    private $_countryCurrent;
    private $countries = array();
    private $languages = array();
    private $settings = array();

    public function __construct()
    {

        $this->CI =& get_instance();

        /* Load lists */
        $this->CI->load->library('listdata');
        $this->countries['country'] = $this->CI->listdata->country;
        $this->countries['country_code'] = $this->CI->listdata->country_code;
        $this->countries['country_lang'] = $this->CI->listdata->country_lang;
        $this->languages = $this->CI->listdata->languages_sys;
    }

    public function route()
    {
      //Here I put data to $settings
    }

}

метод route метод init в hook

В конце конструктора:

/* Add object of class to GI instance */
$this->CI->LCode_module = new stdClass;
$this->CI->LCode_module->settings = &$this->settings;

После того, как я пытаюсь получить данные в контроллере:

$CI =& get_instance();
$c = $CI->LCode_module;
var_dump($c); // NULL

1 ответ

Используйте это как ваш класс, я создал статическую опцию, которую вы можете использовать, когда вам нужно:

<?php
class LCode_module
{
    private $CI;
    private $_default_lang = "en";
    private $_sufixLangDefault = "_EN";
    private $allowedLanguages = array();

    private $_countryCurrent;
    private $countries = array();
    private $languages = array();
    private $settings = array();

    private static $instance;
    private static $static_settings;

    public function __construct()
    {

        $this->CI =& get_instance();

        /* Load lists */
        $this->CI->load->library('listdata');
        $this->countries['country'] = $this->CI->listdata->country;
        $this->countries['country_code'] = $this->CI->listdata->country_code;
        $this->countries['country_lang'] = $this->CI->listdata->country_lang;
        $this->languages = $this->CI->listdata->languages_sys;
        self::$instance = &$this;
        self::$static_settings = &$this->settings;
    }

    public function route()
    {
        //Here I put data to $settings
    }

    public static function getInstance(){
        if (is_null(self::$instance)) { self::$instance = new self(); }
        return self::$instance;
    }

    public static function settings($key = NULL){
        $instance = self::getInstance();
        if(is_null($key)) return $instance::$static_settings;
        return (array_key_exists($key, $instance::$static_settings) ? $instance::$static_settings[$key] : null);
    }
}

Тогда вы просто позвоните

LCode_module::settings()

когда вам нужно получить настройки

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

Другие вопросы по тегам