【问题标题】:fat models and thin controllers in codeignitercodeigniter 中的胖模型和瘦控制器
【发布时间】:2015-04-24 01:14:38
【问题描述】:

这是一个 user.php 控制器

public function verifyLogin() {
    if (isset($_POST["email"])) {
        $e = $this->input->post("email");
        $p = $this->input->post("pass");

        $this->form_validation->set_rules("email", "email", "required|valid_email|xss_clean");
        $this->form_validation->set_rules("pass", "password", "required|xss_clean");

        if ($this->form_validation->run()) {
            $data = array(
                'select' => '*',
                'table' => 'users',
                'where' => "email = '$e' AND activated = '1'"
            );
            $checklogin = $this->query2->selectData($data);
            if ($checklogin === FALSE) {
                echo "quering userInfo fails. email is wrong or activation not done";
                exit();
            } else {
                foreach ($checklogin as $row) {
                    $dbid = $row->id;
                    $dbusername = $row->username;
                    $dbpassword = $row->password;
                    $dbemail = $row->email;
                    if ($p === $dbpassword) {
                        $login_data = array(
                            'name' => $dbusername,
                            'email' => $dbemail,
                            'password' => $dbpassword,
                            'id' => $dbid,
                            'expire' => '86500',
                            'secure' => TRUE,
                            'logged_in' => TRUE
                        );
                        $this->input->set_cookie($login_data);
                        $this->session->set_userdata($login_data);
                        if ($this->session->userdata("logged_in")) {
                            $time = time();
                            $now = unix_to_human($time, TRUE, 'us');
                            $updateLogin = $this->query1->updateLogin($e, $now);
                            if ($updateLogin) {
                                echo "success";
                            } else {
                                echo 'update failed';
                            }
                        } else {
                            echo "session failed";
                        }
                    }else{
                        echo 'password incorrect';
                    }
                }
            }
        } else {
            echo "form validation fails";
        }
    } else {
        $this->load->view('header');
        $this->load->view('login');
        $this->load->view('modal');
        $this->load->view('footer');
    }
}

这是model.php

public function selectData($data){

    if(isset($data['direction'])){
        $dir = $data['direction'];
    }else{
        $dir = "ASC";
    }

    if(isset($data['offset'])){
        $off = $data['offset'];
    }else{
        $off = '0';
    }

    if(isset($data['select']) && isset($data['table'])){
        $this->db->select($data['select'])->from($data['table']);
    }

    if(isset($data['where'])){
        $this->db->where($data['where']);
    }
    if(isset($data['order_by_name'])){
        $this->db->order_by($data['order_by_name'], $dir);
    }
    if(isset($data['limit'])){
        $this->db->limit($data['limit'], $off);
    }

    $query = $this->db->get();

    if($query){
        $d = $query->result();
        return $d;
    }else{
        return FALSE;
    }

}

这是查询数据库的好方法吗? 我是 mvc 的新手,我到处都在阅读“胖模型和这个控制器” 怎样才能使它成为一个好的 mvc 架构?

【问题讨论】:

  • 在生活中,胖控制器和瘦模型肯定更可取吗?
  • 除了控制器内的回声,我没有看到重大错误。策略不是最好的,但也没有错。为什么不对所有数据库访问执行多个模型和特定功能,而不是使用一个通用选择功能?

标签: mysql codeigniter model-view-controller


【解决方案1】:

只有在开发时才可以从控制器中回显:

 if ($checklogin === FALSE) {
                echo "quering userInfo fails.

如果检查登录是假的,那么要么显示一个视图,要么转到一个新的方法,比如

 if ($checklogin === FALSE) { 

      $this->showLoginFailed($errorMessage) ; 

控制器中的检查登录代码是可以重构为模型的一个很好的例子。然后,如果您需要从另一个控制器检查登录,那就更容易了。将表单验证代码放入模型中将是另一种选择。通常,当您验证表单代码时,您也在插入/更新数据库表——因此将所有这些细节放在一个模型中可以使事情变得更容易长期。

“胖模型”并不意味着模型中的一个方法可以做一百件事。它意味着控制器说——这个客户表单是否验证并插入到数据库中?是还是不是? 3行代码。

模型的代码正在查看表单、验证、数据库等的“胖”细节。与控制器中的 3 行相比,它有 50 行或更多行。但是模型中的方法仍然应该是干净的:小而具体。

【讨论】:

  • 所以我应该将它们分开以供特定用途,而不是制作一般的 selectData 函数。我实际上有 8 个不同的选择查询。我仅将 echo 用于开发目的。你能解释一下重构的checklogin功能吗???
猜你喜欢
  • 2012-01-25
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 2012-02-02
  • 2013-03-12
相关资源
最近更新 更多