Codeigniter构造函数 - 检查用户是否已登录

hai*_*ets 4 php oop codeigniter

我试图为我的控制器创建一个构造函数,该构造函数引用一个我自动加载的帮助程序中包含的函数.

该功能检查用户是否已登录,如果是,则将其重定向到登录页面.

看来我没有正确设置构造,因为我收到以下错误:

Fatal error: Call to undefined method Profile::is_logged_in()
Run Code Online (Sandbox Code Playgroud)

这是控制器:

<?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';

    }

} 
Run Code Online (Sandbox Code Playgroud)

我只想在用户登录时使控制器内的功能可访问.

这是自动加载的帮助程序

$autoload['helper'] = array('url','array','html','breadcrumb','form','function','accesscontrol');
Run Code Online (Sandbox Code Playgroud)

(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');
        }       
    }
Run Code Online (Sandbox Code Playgroud)

为什么我无法运行该功能?包含帮助程序中的代码是最好的方法吗?

Dam*_*rsy 9

正如其他已经提到的那样,帮助程序只是函数的集合.扩展它们:

  • 因为它们有时会被加载多次,所以你需要指定不要声明一个函数(如果已经存在),所有你都会引发错误.
  • 此外,您无法在不首先实例化主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();      
           }       
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

我也会让它返回而不是echo移动die()到控制器,但这是另一个故事.


swa*_*ins 6

助手只是包含的功能,因此您无需使用它$this.只需将其称为正常功能:

is_logged_in();
Run Code Online (Sandbox Code Playgroud)