正确的MVC概念在传递DB数据时可以查看

时间:2012-12-14 08:57:07

标签: php codeigniter

我想使用正确的MVC概念。所以,比如在模型中我们有查询到DB

    class my_model {

        public function getUserData () {
            $res = $this->db->query("
                SELECT name, lastname, age, mail FROM users
            ");

            return $res;
        }

    }

我的所作所为:我将mysqli_result对象传递给视图,然后在while周期中查看来自DB的数据。

但据我所知,传递mysqli_result来观察,是不对的MVC。

那么,在这样的情况下,你能告诉我,什么是正确的MVC解决方案?

3 个答案:

答案 0 :(得分:1)

在MVC中,视图将直接从模型请求数据,并且不会通过任何方式传递数据。视图依赖于模型并请求其自己的数据。请参阅此答案:How is MVC supposed to work in CodeIgniter以获取有关原因的更详细说明。

答案是在模型之后初始化视图,并在构造函数中传递整个模型。

e.g。

class View {
    private $model;

    public function __construct(my_model $model) {
        $this->model = $model;
    }

    public function output() {
        $html = '<ul>';
        foreach ($this->model->getUserData() as $row) {
            $html .= '<li>' . $row->name . '</li>';
        }
        $html .= '</ul>';
        return $html;       
    }
}

答案 1 :(得分:0)

我认为您应该实现一个包含用户数据的DTO类。然后你应该将这个DTO类与Iterator一起使用,这样你在获取结果时就不会初始化100个DTO类。 一个好的做法是实现一个服务外观,它执行实际的数据库查询和迭代器构建,这样你的模型只调用这个存储库。

答案 2 :(得分:-1)

在我的MVC中,我会做类似的事情:

class my_model {
  public function getUserData () {
    $res = $this->db->query("
      SELECT name, lastname, age, mail FROM users
    ");

    while ($row = mysql_fetch_assoc($res)) {
      $results[] = $row;
    }
    return $results;
  }
}

class my_controller {
  function index() {
    $user_data = $my_model->getUserData();
    include("view.php");
  }
}



  // view.php
  echo "<ul>";
  foreach ($user_data as $d) {
      echo "<li>" . $d[keyname] . "</li>";
  }
  echo "</ul>";