我搜索了整个互联网,要么没有人提到我的问题,要么我是愚蠢的,或者也许这只是编码的糟糕日子。
情况如何:
“登录”模型是从 autoload.php 加载的,然后在每个控制器的构造函数中,我有 $ this-> login-> check(),正在检查用户是否已登录(显然)。然后在一些方法中,我使用“源”模型连接到数据库。
我尝试从自动加载阵列中加载两个模型,我也试图以here描述的方式加载它们,但显然是旧的CI版本(该线程来自2008)我尝试了所有我心中可能的方式。
无论如何,结果如下:
遇到PHP错误
严重性:注意
消息:未定义属性:Source :: $ login
文件名:controllers / source.php
行号:10
致命错误:在第10行的... \ application \ controllers \ source.php中的非对象上调用成员函数check()
任何想法我缺少什么或如何修复它?我被困了几个小时,我没有任何想法,我能做什么......
编辑1 :这是“来源”控制器的代码:
类Source扩展CI_Controller {
function __construct() { parent::__construct(); $this->load->model('login'); $this->login->check(); } function index() { // Pagination config, getting records from DB $this->load->view('templates/layout', $data); } function add() { $this->load->model('source', '', true); $btn = $this->input->post('btn'); if(isset($btn)) { // More form validation if($this->form_validation->run() == TRUE) { if($btn == "Add") { // here I am supposed to use the source model... } } } $data['page'] = 'source_add'; $this->load->view('templates/layout', $data); }
}
>
编辑2:login.php :
类登录扩展了CI_Model {
function __construct() { parent::__construct(); } function authenticate($username, $password) { // the login script comes here } function logged() { if($this->session->userdata('logged') == true) { return true; } else return false; } function check() { if(!$this->logged()) { redirect('/authentication'); } }
}
>
答案 0 :(得分:6)
传统上,模型的类名应以_model结尾,因此它不会与具有相同名称的控制器发生冲突,因此请尝试更改
class Login extends CI_Model {
到
class Login_model extends CI_Model {
答案 1 :(得分:0)
我通过利用钩子解决了这个问题,并将登录过程转换为控制器,从而能够访问用户信息并设置访问级别。
首先,我将以下内容添加到config文件夹中的hooks.php文件中
$hook['post_controller_constructor'][] = array('function' => 'check_login','filename' => 'authority.php','filepath' => 'hooks');
然后我在名为authority.php的挂钩文件中有以下函数
[编辑]审查了这个后,我将其更改为pre_controller_constructor,看看我是否可以删除初始构造中似乎是双页闪存的内容。[/ EDIT]
function check_login(){
$CI =& get_instance();
$is_logged_in = $CI->session->userdata('is_logged_in');
if(!$is_logged_in){
$unauth_pages = array(your unauthorized pages go here);
if(!in_array($CI->router->class,$unauth_pages)){
$CI->session->set_userdata('before_login_url',current_url());
redirect('login');
}
}
}
function check_authority(){
$CI =& get_instance();
if($CI->session->userdata('usergroupID') == 'SUPADMIN'){return;}
$page = $CI->router->class ;
$method = $CI->router->method;
$method = ($method=='index')?'':$method;
$unauth_pages = array(your unauthorized pages go here);
if(in_array($page,$unauth_pages))return;
$user_group = $CI->session->userdata('usergroupID');
$CI->load->model('user_model');
if($user_group == 'ADMIN' || $user_group == 'USER'){
if($CI->session->userdata('timezone') == ''){
date_default_timezone_set('Canada/Pacific');
} else {
date_default_timezone_set($CI->session->userdata('timezone'));
}
}
if( !$CI->user_model->authorized_content($CI->session->userdata('usergroupID'),$page, $method)){
redirect('unauthorized');
}
}
使用上面的内容我不必担心检查每个页面,而是利用ci框架对我进行检查..如果它不在unauth页面数组中那么它是一个需要授权检查的页面。
希望这适合你。