【问题标题】:Codeigniter $this->session->... not loading (failing) when adding constructor to controllerCodeigniter $this->session->... 向控制器添加构造函数时未加载(失败)
【发布时间】:2016-12-18 02:12:44
【问题描述】:

我正在使用 autoload.php 自动加载“会话库”。

我在我的Users/Login 方法中使用以下代码在我的控制器中设置我的用户数据。

$teacher_data = [
    'teacher_id' => $user_id,
    'username' => $username,
    'logged_in' => true
];

$this->session->set_userdata($teacher_data);

现在我只想使用以下命令检查用户是否登录了我的受限页面...

if (!$this->session->userdata('login_in')) {
    redirect('home/login');
}

在我的另一个控制器中,称为“类”,我有以下代码...

class Classes extends CI_Controller
{
    public function create()
    {
        if (!$this->session->userdata('login_in')) {
            echo 'not logged in';
        }
    }
}

如果用户无权查看页面,代码会将用户重定向回登录名,这很好……但是当我添加构造函数时……即使是这样的空构造函数……

class Classes extends CI_Controller
{
    public function __construct()
    {

    }

    public function create()
    {
        if (!$this->session->userdata('login_in')) {
            echo 'not logged in';
        }
    }
}

我收到一个致命错误:

遇到 PHP 错误 严重性:通知消息:未定义 属性:Classes::$session 文件名:controllers/Classes.php 行 编号:12 回溯:文件: C:\xampp\htdocs\php\toucan_app\App\controllers\Classes.php 行:12 函数:_error_handler 文件: C:\xampp\htdocs\php\toucan_app\index.php 行:315 功能: require_once 致命错误:在 null 上调用成员函数 userdata() 在 C:\xampp\htdocs\php\toucan_app\App\controllers\Classes.php 上线 12 遇到 PHP 错误 严重性:错误消息:调用 空文件名上的成员函数 userdata():controllers/Classes.php 行号:12 回溯:

为什么构造函数会导致错误?最终,我想将“已登录”检查添加到类构造函数中,这样我就不必将其添加到每个方法中,从而保护整个类。

【问题讨论】:

  • 我不知道我是否在这里,我以前从未使用过 CI,但我认为您需要在子类中调用 parent::__construct()。扩展类时不会隐式调用父构造,需要显式调用它们。哎呀,我是对的,见here
  • 最好像$this->session->userdata('login_in') == TRUE这样检查会话并手动加载会话库并检查是否工作。
  • @Andrew,绝对正确,我会接受你的回答,谢谢!

标签: php codeigniter session


【解决方案1】:

您可以在会话变量的集合数据中更改您的代码:

$teacher_data = array(
    'teacher_id' => $user_id,
    'username' => $username,
    'logged_in' => true
);

$this->session->set_userdata($teacher_data);

在您可以检查登录登录变量之后:

class Classes extends CI_Controller
{
    public function __construct()
    {
       parent::__construct();
    }

    public function create()
    {
        if (!$this->session->userdata('logged_in')) {
            echo 'not logged in';
        }
    }
}

【讨论】:

    【解决方案2】:

    当子类拥有自己的 __construct 方法时,不会隐式调用父 __constructs

    您需要在子类的构造中调用parent::__construct() 才能使其正常工作。

    有关 CodeIgniter 的 Controller 构造的代码,请参见 here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多