类变量和函数

时间:2014-02-10 23:38:43

标签: php codeigniter

我正在试图弄清楚我的类变量是否正确并且我正确使用它们。和另一个问题一样,我有一些代码在多个地方使用,所以我试图弄清楚我可以移动到我的Admin_Controller并将它变成一个函数。

<?php
if (!defined('BASEPATH'))
    exit('No direct script access allowed');
class Dashboard extends Admin_Controller {
    protected $current_user;
    protected $data;
    public function __construct() {
        parent::__construct();
        $this -> load -> model('user_model', 'user');
        $user_id = $this -> session -> userdata('user_id');
        if ($user_id == FALSE) {
            redirect('login', 'refresh');
        }
        else {
            if ((!is_numeric($user_id)) || (strlen($user_id) < 5)) {
                $this -> session -> unset_userdata('user_id');
                $this -> session -> sess_destroy();
                redirect('login', 'refresh');
            }
            else {
                $this -> current_user = $this -> user -> get($user_id);
                if (!is_object($this -> current_user)) {
                    $this -> session -> unset_userdata('user_id');
                    $this -> session -> sess_destroy();
                    redirect('login', 'refresh');
                }
                else {
                    $this -> data['current_user'] = $this -> current_user;
                }
            }
        }
    }

    public function index() {
        if ($this -> current_user -> user_role_id >= 4) {
            $dashboard = 'admin_dashboard';
        }
        else {
            $dashboard = 'user_dashboard';
        }
        $this -> template -> set_theme('saturn') -> set_layout('default', 'admin') -> set_partial('header', 'admin/partials/header') -> set_partial('navigation', 'admin/partials/navigation') -> build('admin/' . $dashboard, $data);
    }
}

2 个答案:

答案 0 :(得分:1)

记住这一切的风格等等 - 但这就是我的建议

public function __construct() {

    parent::__construct();

    $this->load->model( 'user_model', 'user' );

    if ( ! $this->dashboardUser = $this->user->_verifyAndReturnUser() ) {

        redirect( 'login', 'refresh' ); }

}

// in your user model
function _verifyAndReturnUser() {

    if ( ! $user_id = $this->session->userdata( 'user_id' ) ) {
        $this->session->sess_destroy(); 
        return false ;  }

    elseif ( ! $user = $this->_getUserBy( $user_id )  ) {
        $this->session->unset_userdata( 'user_id' );
        $this->session->sess_destroy();
        return false ;  }

    else { return $user ;  }

}


// do this inside your controller methods (not the constructor)
$data['dashboardUser'] = $this->dashboardUser;

对会话使用数据库选项,因为它不会将所有内容写入客户端cookie。通过将会话检查放入用户模型,您可以轻松地从其他控制器中调用它。也保持你的构造函数整洁。

当你做if / elseif / else时 - 首先检查“not”条件 - 你可以保持你的if检查更简单,更深一层。

控制器方法应确切地确定视图的内容。不同的方法会有不同的要求。因此建议:$ data ['dashboardUser'] = $ this-&gt; dashboardUser;在方法中。

注意在模型方法中我如何保持它通用并调用值$ user ...然后在“仪表板”控制器中我称之为“$ dashboardUser”并将其传递给$ data。所以当你看到对$ dashboardUser的引用时,你的视图中会非常清楚它是什么类型的用户,以及它来自哪个控制器。

答案 1 :(得分:0)

//您可以将两个类变量设为公共

public $current_user;
public $data;

//将您的函数移动到user_model

public function set_user_data() {

    $CI = & get_instance();

    $user_id = $this->session->userdata('user_id');
    if ($user_id == FALSE) {
        redirect('login', 'refresh');
    }
    else {
        if ((!is_numeric($user_id)) || (strlen($user_id) < 5)) {
            $this->session->unset_userdata('user_id');
            $this->session->sess_destroy();
            redirect('login', 'refresh');
        }
        else {
            $current_user = $this->user->get($user_id);
            if (!is_object($current_user)) {
                $this->session->unset_userdata('user_id');
                $this->session->sess_destroy();
                redirect('login', 'refresh');
            }
            else {

                $CI->data['current_user'] = $current_user; // why do you need to add same data in two variable
                $CI->current_user = $current_user; // you can use this variable any where in CI using get_instance()
            }
        }
    }
}