我想使用正确的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解决方案?
答案 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>";