Я использую 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); } }
Вы должны использовать get_instance, чтобы вы могли получить доступ к библиотеке сеанса
Сохранить идентификатор сеанса участника в $ member_id
Загрузите библиотеку участника
Использовать $ member_id в методе библиотеки участников