我认为我的代码现在很混乱,可能是因为我并不真正习惯CI。我目前有一个名为"用户"的控制器,我将在下面显示。 在此控制器中我这里有登录,注销等方法,这些方法足够标准,例如在用户登录时创建会话并在用户注销时销毁会话。IAM还跟踪时间,因为系统模仿"签到"系统来获取用户的工作时间。项目的下一部分需要访问用户使用的数据库中的"客户端"表,并在按下按钮时显示有关此客户端的一些信息,客户端本身不使用此系统,但需要查看有关它们的信息。我只是想知道接下来我应该继续添加到我当前的控制器和模型或设置单独的类,在我看来控制器已经比较大了?这是我的控制器代码。
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class User extends CI_Controller {
var $loggedin = FALSE;
var $cdata;
function __construct()
{
parent::__construct();
$this->load->model("dbaccess");
$this->cdata =array( "warning" => "","email"=> "","password"=> "","logintime"=>"","start"=>"","end"=>""
,"diff"=>"","totalhours"=>"","dis"=>$this);
}
public function index()
{
if($this->session->userdata('email'))
{
$this->load->view('carerview',$this->cdata);
}
else
{
$this->load->view('mainview',$this->cdata);
}
}
public function login()
{
//get posted data. check if what is posted is in db.
// if it is set loggedin=true + redirect to carer page + save data in session. //get posted data. check if what is posted is in db.
if(isset($_POST['email']) )
{$this->cdata['email'] = $_POST['email'] ;}
else
{$this->cdata['email'] ="";}
if(isset($_POST['password']))
{$this->cdata['password'] = $_POST['password'];}
else
{$this->cdata['password'] ="";}
if($this->session->userdata('email'))
{
$this->loggedin = true;
}
else
{
$this->loggedin = $this->dbaccess->check_input($this->cdata['email'],$this->cdata['password']);
}
if($this->loggedin === TRUE && !$this->session->userdata('email'))
{
$this->start_session();
if(!$this->dbaccess->get_date_entry($this->session->userdata('email'),date("Y-m-d")))
{
$data = array("email"=>$this->session->userdata('email'),"date"=>date("Y-m-d"),
"hours"=>"0","starttime"=>date("Y-m-d H:i:s",$this->session->userdata('last_activity')));
$this->dbaccess->insert_daily_row($data);
}
$this->load->view('carerview',$this->cdata);
}
else if ($this->loggedin === TRUE && $this->session->userdata('email'))
{
$this->cdata['totalhours']= $this->session->userdata('totalhours');
$this->cdata['logintime']= $this->session->userdata('last_activity');
$this->load->view('carerview',$this->cdata);
}
else
{
$this->session->unset_userdata('last_activity');
$this->cdata['warning']="Check failed ! Please try again";
$this->load->view('mainview',$this->cdata);
}
}
private function start_session()
{
$this->load->library('session');
$this->session->set_userdata('email',$this->cdata['email']);
$this->cdata['totalhours']= $this->dbaccess->get_hours_by_date
($this->session->userdata('email'),date("Y-m-d",$this->session->userdata('last_activity')));
$this->session->set_userdata('totalhours',$this->cdata['totalhours']);
}
private function calculatedifference($starttime,$endtime) // delete checkin time from checkouttime
{
$diff= abs(strtotime($starttime) - strtotime($endtime));
$this->cdata['diff'] = date("H:i:s",$diff);
$this->cdata['start'] = date("Y-m-d H:i:s", strtotime( $starttime)+(1 * 3600));
$this->cdata['end']= date("Y-m-d H:i:s", strtotime($endtime) +(1 * 3600));
return date("H:i:s",$diff);
}
public function isLoggedIn()
{
return $this->loggedin;
}
public function logOut()
{
// update total hours and update checkout time.
if($this->session->userdata('email')){
$hours=$this->calculatedifference(date("Y-m-d H:i:s",$this->session->userdata('last_activity')),date("Y-m-d H:i:s"));
$data =array("endtime"=>date("Y-m-d H:i:s"),"hours"=>$hours,"email"=>$this->session->userdata('email'),"date"=>date("Y-m-d"));
$this->dbaccess->update_daily_row($data);}
$this->load->view('mainview',$this->cdata);
$this->session->sess_destroy();
}
public function admin()
{
$this->load->view('adminpage',$this->cdata);
}
}
好吧,使用 MVC 框架最终得到一个单控制器应用程序听起来有点矫枉过正。也就是说,如果事实证明您的应用程序只需要实现一个控制器。
此外,您很可能需要不属于"用户"范围的功能。公共内容是一个很好的(也是显而易见的(例子。
此外,CI 以/controller/method/param0/param1/...
性质映射 url,因此只保留 User
会使您的整个 url 命名空间挂起在/user/
路径下方,我认为这不是您想要的。
所以我会走多控制器的方式——或者更确切地说,如果我的设计暗示了这样的需求,我会使用 MVC 框架。
关于你的第二个问题,没有大类或小类(在你的例子中是控制器(这样的东西。这取决于 (1( 如何对应用程序建模和 (2( 编码习惯。
注意上一个答案的建议,当您处理用户特定内容和公共内容时,这里有一个小技巧。我有一个名为 user_base.php 的控制器,在处理用户特定内容(如登录用户的数据(时,它总是首先加载:
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
class User_base extends CI_Controller
{
//define for later use in the construct
public $user_id;
public $username;
function __construct()
{
parent::__construct();
// here load everything you will need to service users.
$this->load->helper('url');
$this->load->library('my_functions');
$this->load->model('my_model');
$this->lang->load('app');
if($this->my_functions->is_logged_in() ){
// if user is really logged in, I prepare often needed variables
$this->user_id = $this->my_functions->get_user_id();
$this->username = $this->my_functions->get_username();
// here i define global variables that once loaded are usable by every view file
$gv['logged'] = true;
$gv['username'] = $this->username;
$gv['user_id'] = $this->user_id;
$gv['something'] = $this->my_model->some_function($this->user_id);
$this->load->vars($gv);
}
else{ // if user is not logged in, throw him out.
redirect('');
}
}
}
?>
现在,准备好这个基础后,我可以开始为用户创建控制器,例如用于用户设置的帐户、视图配置文件等。请注意,首先始终先加载基本文件,然后使用该基本文件扩展控制器。
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
require 'user_base.php';
class Accounts extends User_base{
private $var;
function __construct()
{
parent::__construct();
$this->var = 'some value';
}
function index(){
$data['value_from_DB'] = $this->my_model->get_stuff($this->user_id, $this->var);
$this->load->view('viewAccount', $data);
}
另请注意,现在我可以轻松地跨所有函数以及本地定义的私有变量从user_base加载用户 ID。
最后,在视图文件中,您现在可以调用$username,因为它在user_base.php中加载得很糟糕:
<p>Hello there, <?php echo $username?></p>
然后我会对public_base和admin_base等做同样的事情。换句话说。我会为我能想象到的最广泛的类别定义基础,这些类别是相互排斥的,然后围绕它们创建较小的类别的控制器,例如管理用户帐户的所有功能的帐户(或您的情况下为"用户"(,然后是订单,用于所有视图和报告以及处理订单的流程,或博客网站的博客部分, 等等等等。
希望这有助于结构化和保持代码清洁。