0

我不知道一个好的MVC模式,现在学习......所以,我想做:从数据库中获取行,如果结果没有(0行)打印“我们没有结果”,否则打印结果。

在模型中我有这个 php 代码

function getAutos () {
    //here connect to database

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

}

这个函数返回对象或字符串,对吧?现在我认为:

<!--some html code -->
<?php
$resultFromGetAutos  = /*result from function getAutos ()*/

if (is_object(resultFromGetAutos)) {
     while ($row = resultFromGetAutos->fetch_assoc()) {
         echo row['names']."<br>";
    }
}
else {
    echo resultFromGetAutos;
}
?>
<!--some html code -->

它有效,但据我了解,视图中的许多 PHP 代码不是正确的 MVC,即当我检查视图中的结果类型时:if (is_object(Resultat)) {do something} else { do other something } 这不是正确的 MVC 概念吗?如果不正确,在这种情况下正确的方法是什么?

4

2 回答 2

3

MVC 中的模型不是类或对象。模型是,它包含应用程序中的所有领域业务逻辑。虽然它可能与数据库交互,但它不应该在任何时候直接创建连接。你可能会读到这篇文章。它将包含一些方向。

这里的底线是,您所说的“模型”甚至与原始概念都不接近。

至于视图,在正确的 MVC(或 MVC 启发)模式实现中,视图负责所有表示逻辑。这意味着视图会决定用户可以看到什么。它是通过从模型层获取信息来确定的(在经典MVC和Model2 MVC中直接请求,在MVP和MMVM模式中通过类控制器结构获取)

在 Web 应用程序中,视图会创建响应。响应的形式会根据所使用的请求或接口的不同而有所不同。View 可以通过组合多个模板来创建响应,也可以只发送一个 HTTP 位置标头。

于 2012-10-13T11:43:43.717 回答
1

MVC 设计的原则之一是 Model 和 View 不直接相互访问,甚至不知道彼此。
大多数情况下,视图是最愚蠢的。它不应该理解它正在显示的数据,而应该理解它应该如何显示“数据”,这可能就是一切。
如果它想要汽车,你应该有一个控制器,它会被视图注意到。然后控制器应该向模型询问汽车,并将模型的返回值解析为视图可以直接显示的格式。
或者,如果您应该在页面加载时已经拥有这些自动,请通过构造函数(示例)进行。
它应该如下所示

<View> // you shouldn't include that, that's just that readers notice it is the view.
<?php
    // a bunch of other code
    function AutoView($whatViewShouldDisplay) { // should be the constructor, OOP PHP is not my strongest point
        $content = $whatViewShouldDisplay;
        echo $content;
    }
?>

<Controller>
<?php
    // Bunch of other code
    function AutoController() { // should-be constructor
        $model = new AutoModel();
        $result = $model->getAutos();
        if ($result->num_rows != 0) {
            while ($row = resultFromGetAutos->fetch_assoc()) {
                $viewContent .= row['names']."<br>";
            }
        }
        else {
            $viewContent = "Sorry, no results found.";
        }

        $view = new AutoView($viewContent);
    }
?>

<Model>
<?php
    // Bunch of other code
    function getAutos() {
         return $this->db->query("SELECT names FROM auto");
    }
?>

如您所见,只要模型实现了getAutos()返回 SQL 结果集的方法并且视图具有单参数构造函数,您就可以将它们替换为所有内容!

或者,考虑到您的代码:

<!--some html code -->
<?php
$text  = $controller->requestContentForThisPlace(); // Something like getMainContent()? I don't know where this is on your page.

echo $text;
?>

您的代码的控制器将实现此方法:

function requestContentForThisPlace() {
    $result = $model->getAutos();
    if ($result->num_rows != 0) {
        while ($row = resultFromGetAutos->fetch_assoc()) {
            $content .= row['names']."<br>";
        }
    }
    else {
        $content = "Sorry, no results found.";
    }

    return $content;
}
于 2012-10-13T11:58:30.047 回答