0

我在 MVC 模式中有一个不明白的地方。请帮助理解。

例如,我们在数据库中有汽车表,我们想从表中获取并打印结果,但是如果找不到结果(0 行),在这种情况下打印:“我们没有结果”

这是models.php

class modesl {

function getCars () {

    $res = $this->db->query("SELECT names FROM cars");
    if ($res->num_rows == 0) {
        return "We dont have results";
    }
    else {
        return $res;
    }

}

}

这是views.php

class views {

    function loadHTML ($resultFromCars) {
         require 'carspage.php';
    }

}

这是carspage.php

<html>
<body>
<?php

    if (is_object($resultFromCars)) {
        while ($row = $resultFromCars->fetch_assoc()) {
            echo $row['names']."<br>";
        }
    }
    else {
        echo  $resultFromCars;
    }

?>
</body>
</html>

这是controllers.php

class controllers {

    function generatePage () {  
        $model = new models();
        $resultFromCars = $model->getCars();


        $view = new views();
        $view->loadHTML($resultFromCars);
    }

}

这可行,但据我所知,许多 php 代码(即 condition if (is_object) { } else { })不是正确的 MVC。请告诉这个具体案例,为了获得正确的 MVC 概念,我的架构(大声笑)必须进行哪些更改?

4

2 回答 2

2

我喜欢 Havelock 提供的答案。

我会进一步调整这一点,确保您的模型已经以数组格式返回数据(如果没有找到,则返回 false)。因此,从结果集中提取数据的逻辑保留在模型中,它真正应该在的地方。

你的观点变得更加简单:

<?php

if (!empty($results)) {
  foreach ($results as $row) {
   echo $row['name'] . "<br />";
  }
} else {
    echo "Eh, Nothing found...";
}
于 2012-10-13T14:04:32.090 回答
1

你似乎做得很好,只是一件小事需要改进。由于模型只是数据的包装器,因此您应该只返回数据(并且不返回包含错误/异常消息的字符串)。如果没有要返回的数据,则返回FALSE,就像在 PHP 中所做的那样。

class CarModel {

    function getCars () {

        $res = $this->db->query("SELECT names FROM cars");
        if ($res->num_rows == 0) {
            return FALSE; // if that happens, the function will stop execution here, so no "else" is needed
        }

        return $res;

    }

}

在你看来

<?php

    if ($resultFromCars === FALSE && !empty($resultFromCars)) {
        echo "We don't have results";
    }
    else { // now you know it's not FALSE, so it must be an object, no need to check whether it is one
        while ($row = $resultFromCars->fetch_assoc()) {
            echo $row['names']."<br>";
        }
    }

?>
于 2012-10-13T13:52:52.147 回答