从模型返回结果查看(右MVC概念)

时间:2012-10-13 11:16:27

标签: php model-view-controller

我不知道一个好的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概念?如果不对,在这种情况下如何正确的方式?

2 个答案:

答案 0 :(得分:3)

MVC中的模型不是类或对象。模型为layer,其中包含应用程序中的所有域业务逻辑。虽然它可能与数据库交互,但它不应该在任何时候直接创建连接。您可以阅读this post。它将包含一些方向。

这里的底线是,你所谓的“模特”,甚至不接近原始概念。

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

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

答案 1 :(得分:1)

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

<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");
    }
?>

如您所见,只要Model实现返回SQL结果集的方法getAutos()并且视图具有one-args构造函数,您就可以用所有内容替换它们!

或者,记住您的代码:

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

echo $text;
?>

您的代码的Controller将实现此方法:

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;
}