我一直想知道在模型中用OO风格编写代码的正确方法是什么。当然,您可以使用从DB检索数据然后映射到模型级变量的函数。但是,当您在模型中尝试从BD获取其他数据时,此方法会变得违反直觉。例如:
class User extends CI_Model {
$id, $name, $age .... ;
public function get_user_from_db_with_id($id) {
...
// get data and map to variable.
}
public function get_all_users() {
// return all users in db
}
}
控制器中的某个地方:
$user = new User();
$ben = $user->get_user_from_db_with_id($id);
// this does not make sense!!
$all_user = $ben->get_all_users();
有任何想法或评论吗?
提前致谢!
答案 0 :(得分:3)
我必须做出类似的决定并选择了这个(为了清晰起见而修剪)
class UserModel extends MY_Model
{
public $UserID = 0;
public $CustomerID = null;
public $FirstName = '';
public $LastName = '';
public $EmailAddress = '';
public $Password = null;
public $UserGroupID = true;
function __construct()
{
parent::__construct();
}
private function get($id)
{
$row = $this->get($id);
if ($row !== null)
{
$this->dbResultToObject($row, $this);
}
}
// Return an array of User objects
public function get_list($deleted = false, $userIDToInclude = null)
{
$params = array(null, $deleted, $userIDToInclude);
$query = $this->db->call("spUserGet", $params);
$users = array();
foreach ($query->result() as $row)
{
$user = new UserModel();
$this->dbResultToObject($row, $user);
$users[] = $user;
}
return $users;
}
// Other Methods (Validate, Save etc)
}
我使用public,protected和private属性的混合,以便我编写的反射代码用于映射DB结果和DB sproc调用的属性,然后只包含公共属性并防止发送太多参数。但那是偏离主题所以我的控制器就像是:
class Users extends MY_Controller
{
public function __construct()
{
parent::__construct();
$this->load->model('UserModel', 'user');
}
....
}
然后可以使用
检索列表$users = $this->user->get_list();
和
的单一记录$user = $this->user->get($userID);
答案 1 :(得分:0)
既然您正在考虑OO编程,我认为您需要思考:这个类代表什么?
如果是第一种情况,那么这个类有$ id,$ name,$ age等属性是有意义的.... 并且以下代码有意义
$user = new User();
$ben = $user->get_user_from_db_with_id($id);
如果是第二种情况,则不应该在样本中使用$ id,$ name,$ age等属性。
和这些代码
$all_user = $ben->get_all_users();
应该替换为
$all_user = $user->get_all_users();
答案 2 :(得分:0)
我非常喜欢在“角色”方面考虑设计 - 而不是资源。所以“用户”将能够获得自己的个人资料。但它只能是一个能够获得所有用户配置文件的“管理员”。
因此,用户可以做的事情之间的区别和重要区分 - 获取一条记录 - 以及管理员可以做什么 - 获取所有记录 - 首先为每个记录分别设置控制器。用户控制器方法基于验证单个用户并授予他们访问一条记录的权限。管理控制器方法基于验证管理员并授予他们访问所有记录的权限。即使从URL设计的角度来看,这也很有意义 - 您希望管理区域明显分开。
控制器的这种分离使一切变得更简单,更容易。当您面向资源时,您不断检查每种方法甚至视图中的凭据。观点应该尽可能简单,不要被赋予“这个人是管理员”吗?当您面向角色时 - 检查控制器中的凭据 - 然后您的方法,模型和视图适合于“角色”需要完成的任务。