我正在试图弄清楚我的类变量是否正确并且我正确使用它们。和另一个问题一样,我有一些代码在多个地方使用,所以我试图弄清楚我可以移动到我的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);
}
}
答案 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()
}
}
}
}