1

我想使用正确的 MVC 概念。所以,说在模型中我们有例如查询数据库

    class my_model {

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

            return $res;
        }

    }

我做什么:我将mysqli_result对象传递给视图,然后在while循环视图中从数据库打印数据。

但据我所知,传递mysqli_result给视图,是不对的 MVC。

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

4

3 回答 3

1

在 MVC 中,视图会直接从模型中请求数据,而不会被任何东西传递数据。视图依赖于模型并请求自己的数据。请参阅此答案:MVC 应该如何在 CodeIgniter 中工作,以更详细地描述为什么会这样。

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

例如

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;       
    }
}
于 2012-12-14T09:10:37.093 回答
0

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

于 2012-12-14T09:00:33.437 回答
-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>";
于 2012-12-14T20:14:43.260 回答