Конструктор Codeigniter - проверить, вошел ли пользователь в систему - PullRequest
4 голосов
/ 18 ноября 2011

Я пытаюсь создать конструктор для моего контроллера, который ссылается на функцию, которая содержится в помощнике, который загружается автоматически.

Функция проверяет, вошел ли пользователь в систему или нет, и перенаправляет его на страницу входа.

Похоже, я неправильно настроил конструкцию, так как получаю следующую ошибку:

Fatal error: Call to undefined method Profile::is_logged_in()

Это контроллер:

<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class Profile extends CI_Controller {

       public function __construct()
       {
            parent::__construct();
            //function inside autoloaded helper, check if user is logged in, if not redirects to login page
            $this->is_logged_in();
       }

    public function index() {

    echo 'hello';

    }

} 

Я хочу сделать функцию внутри контроллера доступной, только если пользователь вошел в систему.

Это помощник, который загружается автоматически

$autoload['helper'] = array('url','array','html','breadcrumb','form','function','accesscontrol');

(accesscontrol_helper.php):

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

    function is_logged_in()
    {
        $is_logged_in = $this->session->userdata('is_logged_in');
        if(!isset($is_logged_in) || $is_logged_in != true)
        {
            echo 'You don\'t have permission to access this page. <a href="../login">Login</a>';    
            die();      
            //$this->load->view('login_form');
        }       
    }

Почему я не смогу запустить функцию? Содержит ли код в помощнике лучший метод?

Ответы [ 4 ]

9 голосов
/ 18 ноября 2011

Как уже упоминалось, помощники - это просто набор функций. Расширяя их:

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

    if(!function_exists('is_logged_in'))    
    {
        function is_logged_in()
        {
        $CI =& get_instance();
        $is_logged_in = $CI->session->userdata('is_logged_in');
           if(!isset($is_logged_in) || $is_logged_in != true)
           {
            echo 'You don\'t have permission to access this page. <a href="../login">Login</a>';    
            die();      
           }       
        }
    }
    

Я бы также вернул его вместо echo и переместил die() к контроллеру, но это уже другая история.

6 голосов
/ 18 ноября 2011

Помощники - это просто включенные функции, поэтому вам не нужно обращаться к ним с помощью $this. Просто вызовите его как обычную функцию:

is_logged_in();
3 голосов
/ 18 ноября 2011

Вы не вызываете вспомогательную функцию, используя $this. Просто сделай is_logged_in();

public function __construct()
{
    parent::__construct();
    //function inside autoloaded helper, check if user is logged in, if not redirects to login page
    is_logged_in();
}
1 голос
/ 18 ноября 2011

accesscontrol_helper.php :

 <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 class Accesscontrol_helper{
 function is_logged_in()
 {
 //code
 }
 }

in Профиль Контроллер:

class Profile extends CI_Controller {

       public function __construct()
       {
            parent::__construct();
            Accesscontrol_helper::is_logged_in();
       }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...