CodeIgniter: помощники загрузки (pre_controller)

Я пытаюсь загрузить хелпер cookie в моем кэше pre_controller для функции "запомнить меня" на нашем сайте. Я думал, что создание экземпляра объекта CI с помощью $ci = & get_instance(); позволит мне получить доступ к помощникам загрузки, но это не так.

Мысли?

 $ci =& get_instance();
 $ci->load->helper('cookie');
 // does not load

Ответ 1

Захват pre_controller выполняется до того, как супер объект был полностью сконструирован, поэтому get_instance() не может работать - статический объект, который возвращает ссылку, еще не был инициализирован.

Вместо этого используйте вместо этого post_controller_constructor hook; ваш конструктор контроллера будет выполнен, и супер объект CI будет доступен для использования.

Ответ 2

Проблема с post_controller_constructor выполняется после конструктора (достаточно забавно), и если вы используете конструкторы Controller для многих вещей, это может быть проблемой.

Если это не проблема для вас (ваш помощник не влияет на что-либо, запущенное или загруженное в ваших конструкторах) достаточно справедливо, если это проблема, у вас есть два решения.

  • Вместо того, чтобы закрепить свой код в MY_Controller
  • Создайте MY_Controller и добавьте пользовательскую точку привязки.

    class MY_Controller extends Controller
    {
    
        function MY_Controller()
        {
            parent::Controller();
            $GLOBALS['EXT']->_call_hook('pre_controller_constructor');
        } 
    }
    

Обратите внимание, что если вы используете CodeIgniter 3.0 или новее, функция _call_hook была переименована в call_hook.