面向对象的Codeigniter模型方法

我一直在想,在模型中以OO风格编写代码的正确方法是什么。 当然,你可以有一个函数从数据库中检索数据,然后映射到模型级别的变量。 然而,这种方法在您试图从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();

任何想法或评论?

提前致谢!


我不得不作出类似的决定,并选择了这个(为清晰起见而修剪)

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)
}

我使用公共属性,受保护属性和私有属性的混合,以便我写入的映射代码将数据库结果中的属性映射到数据库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);

既然你在考虑面向对象编程,我认为你需要思考:这个类代表什么?

  • 每个实例是指一个用户?
  • 每个实例意味着一个用户数据生成器?
  • 如果是第一种情况,这个类有如$ 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();
    

    我非常喜欢从“角色”角度思考设计 - 而不是资源。 所以“用户”将能够获得他们自己的配置文件。 但它只能成为能够获得所有用户配置文件的“管理员”。

    因此用户可以执行的操作之间的区别和重要区别 - 获取一条记录 - 以及管理员可以执行的操作 - 获取所有记录 - 首先为每个记录分配控制器。 用户控制器方法基于验证单个用户并授予他们对一条记录的访问权限。 管理控制台方法基于验证管理员并授予他们对所有记录的访问权限。 即使从网站设计的角度来看,这也很有意义 - 您希望您的管理区域明确分开。

    控制器的这种分离使得一切都变得简单和容易。 当你是资源导向的时候,你不断地检查每种方法的证书,甚至在你的意见中。 观点应该尽可能简单,而不是任命“这个人是管理员”? 当你是角色导向的时候 - 你检查控制器中的证书 - 然后你的方法,模型和视图适合于这个'角色'需要完成的事情。

    链接地址: http://www.djcxy.com/p/18551.html

    上一篇: Object Oriented Approach in Codeigniter Model

    下一篇: Laravel redirect to route from controller when called by AJAX