Использовать данные сеанса в Hook в CodeIgniter 2.1.0

Я использую CodeIgniter с версией 2.1.0. Я хочу использовать Hooks для аутентификации входа. Это означает, что я хочу, чтобы в каждом контроллере проверялись данные сеанса, если они были зарегистрированы или нет. Поэтому я хочу использовать крючки. Для этого я делаю следующий код:

В файле конфигурации

$config['enable_hooks'] = TRUE; 

В файле hooks.php

 $hook['post_controller_constructor'][] = array( 'class' => 'SessionData', 'function' => 'initializeData', 'filename' => 'loginHelper.php', 'filepath' => 'hooks', 'params' => array() ); 

В файле loginHelper.php

 class SessionData{ var $CI; function __construct(){ $this->CI =& get_instance(); } function initializeData() { // This function will run after the constructor for the controller is ran // Set any initial values here if (!$this->session->userdata('username')) { // This is line 13 redirect('login'); } } } в class SessionData{ var $CI; function __construct(){ $this->CI =& get_instance(); } function initializeData() { // This function will run after the constructor for the controller is ran // Set any initial values here if (!$this->session->userdata('username')) { // This is line 13 redirect('login'); } } } 

Но это вызывает следующую ошибку:

 A PHP Error was encountered Severity: Notice Message: Undefined property: SessionData::$session Filename: hooks/loginHelper.php Line Number: 13 

Как я могу это решить?

« Вызывается очень рано во время выполнения системы. На данный момент загружен только класс тестов и крючков … »

Вы должны загружать все библиотеки и модели вручную, которые вы используете внутри Hook:

 if (!isset($this->CI->session)) { $this->CI->load->library('session'); } 

И используйте $this->CI->session->userdata() вместо $this->session->userdata() .

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

Таким образом, в вашем классе sessionData вам нужно загрузить класс сеанса с помощью sessionData CodeIgniter.

 class SessionData { var $CI; function __construct(){ $this->CI =& get_instance(); if(!isset($this->CI->session)) // Check if the session library is loaded or not $this->CI->load->library('session'); // If not loaded, then load it here } function initializeData() { // This function will run after the constructor for the controller is ran // Set any initial values here if (!$this->CI->session->userdata('username')) { // Call session methods with super object redirect('login'); } } } в class SessionData { var $CI; function __construct(){ $this->CI =& get_instance(); if(!isset($this->CI->session)) // Check if the session library is loaded or not $this->CI->load->library('session'); // If not loaded, then load it here } function initializeData() { // This function will run after the constructor for the controller is ran // Set any initial values here if (!$this->CI->session->userdata('username')) { // Call session methods with super object redirect('login'); } } } 

Вышеупомянутый код – это ваш модифицированный код, и я разместил упомянутый вами код сафаров.

 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class sessiondata extends CI_Controller{ function initializeData(){ **// imports libraries.** $this->load->library('session'); $this->load->helper('url'); $this->load->helper('form'); if(!$this->session->userdata('email')): redirect('login'); endif; } } в <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class sessiondata extends CI_Controller{ function initializeData(){ **// imports libraries.** $this->load->library('session'); $this->load->helper('url'); $this->load->helper('form'); if(!$this->session->userdata('email')): redirect('login'); endif; } } 

Я предполагаю, что вы забыли загрузить свою библиотеку сеансов.

Решение расширяет пример CI_Controller:

 class SessionData extens CI_Controller { $this->load->library('session'); # Code .. } 
 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class MembersLoader { function initialize() { $CI =& get_instance(); // Load Session $CI->load->library('session'); $member_id = $CI->session->userdata('userid'); // Load Members Stuff $CI->load->library("members"); $CI->members->set_members_data($member_id); } } 
  1. Вы должны использовать get_instance, чтобы вы могли получить доступ к библиотеке сеанса

  2. Сохранить идентификатор сеанса участника в $ member_id

  3. Загрузите библиотеку участника

  4. Использовать $ member_id в методе библиотеки участников