Codeigniter模型中面向对象的方法

时间:2014-01-16 22:03:40

标签: codeigniter oop model codeigniter-2

我一直想知道在模型中用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();

有任何想法或评论吗?

提前致谢!

3 个答案:

答案 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编程,我认为您需要思考:这个类代表什么?

  1. 每个实例意味着一个用户?
  2. 每个实例意味着一个用户数据生成器?
  3. 如果是第一种情况,那么这个类有$ 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设计的角度来看,这也很有意义 - 您希望管理区域明显分开。

控制器的这种分离使一切变得更简单,更容易。当您面向资源时,您不断检查每种方法甚至视图中的凭据。观点应该尽可能简单,不要被赋予“这个人是管理员”吗?当您面向角色时 - 检查控制器中的凭据 - 然后您的方法,模型和视图适合于“角色”需要完成的任务。